资讯详情

GitHub Copilot Custom Chat Mode 实战:用 MCP 接入 TaoToken 分析亚洲杯男篮球员数据

📅 2026/10/11 15:37:15 | 华诺云谱 👁 阅读
GitHub Copilot Custom Chat Mode 实战:用 MCP 接入 TaoToken 分析亚洲杯男篮球员数据
1. 为什么要在 VS Code 里给 Copilot 造一个「亚洲杯球员分析」专属模式GitHub Copilot 内置的 Ask、Edit、Agent 三种模式已经能覆盖大部分编码场景但当你反复问同一类问题——比如「中国队这次亚洲杯的平均身高是多少」「哪支球队平均年龄最大」——每次都要重新贴数据、重新解释字段含义多轮对话里上下文越堆越长回答反而越来越飘。Custom Chat Mode 就是解决这个痛点的它把一段固定的系统指令、一组允许调用的工具、以及一个明确的角色定位固化成一个.chatmode.md文件之后你在下拉框里选中它Copilot 就自动带着这套规则开始工作。我这次做的场景很具体2025 亚洲杯男篮已经打到四强澳大利亚、新西兰也参赛我想在 VS Code 里直接问球员数据而不是切到浏览器查表格。做法是两条线并行——一条是 Custom Chat Mode 定义「我是谁、我该怎么答」另一条是 MCPModel Context Protocol把模型请求和本地数据接口接起来同时把模型通道统一走 TaoToken 的 Key/API这样不用在多个供应商之间来回换配置。适合谁看已经在用 VS Code GitHub Copilot、想给 Copilot 加「领域专精」能力的开发者手头有 .NET 项目、想用 MCP C# SDK 暴露数据库查询能力的后端同学以及想把模型调用收敛到统一入口、不想每个工具都单独配一遍 Key 的人。下面从零开始配置、代码、验证、排错都给全。2. TaoToken 前置准备统一 Key 与 API 通道怎么接在动手写 chatmode 之前先把模型通道这件事定下来。GitHub Copilot 本身支持添加额外模型但如果你希望 MCP 服务端、以及后续其他工具都走同一个入口用 TaoToken 会比较省心——一个 Key 覆盖多种模型Base URL 固定换模型只改 Model ID。2.1 拿到 API Key 和 Base URL打开 TaoToken 控制台在 API Keys 页面创建一个新 Key。建议按用途命名比如vscode-copilot-mcp方便以后区分。创建后立刻复制保存页面刷新后就不再完整显示。控制台入口https://taotoken.net/consoleAPI Keys 页面https://taotoken.net/api-keys接入文档https://taotoken.net/docBase URL 统一用https://taotoken.net/api注意这个地址后面不要加 UTM 参数直接作为 OpenAI 兼容接口的根地址使用。2.2 确认可用模型在模型对话页面可以先试一下目标模型是否可用比如claude-sonnet-4-5或gpt-4o这类。试的时候把 Base URL 填https://taotoken.net/apiKey 填刚创建的发一句「你好」确认返回正常。模型对话入口https://taotoken.net/chat2.3 三件套先记牢不管后面是配 MCP 服务端还是配 Copilot 的模型通道永远就这三样项目值Base URLhttps://taotoken.net/apiAPI Key控制台创建的sk-...Model ID如claude-sonnet-4-5、gpt-4o这三件套在后面的settings.json、MCP 服务端环境变量、以及 chatmode 的 tools 声明里都会出现先记牢配的时候不容易漏。2.4 为什么不让 MCP 直连生产库这里要强调一个安全边界MCP 服务端暴露给模型的工具应该是只读查询而且最好走独立的只读账号或视图。我这次的数据是亚洲杯球员信息存在 SQL Server 里MCP 服务端只提供「按球队查球员」「按球队算平均年龄身高」这类查询方法不提供任何写操作。生产库直连给模型是危险动作别做。3. 可复制配置chatmode 文件 MCP 服务端 .NET 数据接口这一节是全文的核心三块配置都给可直接复制的片段。3.1 创建 Custom Chat Mode 文件在 VS Code 里打开 GitHub Copilot 面板点下方的 mode 下拉框选Configure Modes...再点Create new custom chat mode file选择.github\chatmodes目录输入文件名亚洲杯球员分析.chatmode.md回车生成。生成后把内容替换成下面这份。注意tools里既列了内置工具也列了后面要接的 MCP 工具集--- description: 分析2025亚洲杯男篮各国球员信息包括名单、平均年龄、平均身高、CBA现役球员等 tools: - codebase - search - my-mcp-server --- 你是亚洲杯男篮数据分析助手。你的职责是基于 MCP 工具返回的真实数据回答球员相关问题。 规则 1. 所有球员数据必须来自 my-mcp-server 的工具调用结果不得凭记忆编造。 2. 回答涉及统计时先调用工具获取数据再给出结论。 3. 涉及排名时明确说明排序依据如按平均年龄从大到小。 4. 如果工具返回为空直接说明「未查询到该队数据」不要猜测。 5. 回答用中文统计数字保留一位小数。description决定这个模式在下拉框里显示什么tools决定它能调用哪些能力正文部分是 instructions也就是系统提示词。这三块就是 chatmode 的全部结构。3.2 MCP 服务端项目结构MCP 服务端用 .NET 9 ModelContextProtocol.AspNetCore数据访问用 EF Core 9。项目文件里加包引用PackageReference IncludeModelContextProtocol.AspNetCore Version0.1.0-preview.7 / PackageReference IncludeMicrosoft.EntityFrameworkCore.SqlServer Version9.0.0 /目录结构大致这样AsiaCupMcpServer/ ├── Program.cs ├── Data/ │ ├── AsiaCupContext.cs │ └── Player.cs ├── Tools/ │ └── PlayerTools.cs └── appsettings.json3.3 数据模型与 DbContextpublic class Player { public int Id { get; set; } public string Team { get; set; } ; public string Name { get; set; } ; public int Age { get; set; } public double HeightCm { get; set; } public string Position { get; set; } ; public bool IsCbaActive { get; set; } } public class AsiaCupContext : DbContext { public AsiaCupContext(DbContextOptionsAsiaCupContext options) : base(options) { } public DbSetPlayer Players SetPlayer(); }3.4 MCP 工具方法工具方法用[McpServerTool]标注模型会根据 description 决定调哪个public class PlayerTools { private readonly AsiaCupContext _db; public PlayerTools(AsiaCupContext db) _db db; [McpServerTool, Description(查询指定球队的球员名单)] public async TaskListPlayer GetPlayersByTeam(string team) await _db.Players.Where(p p.Team team).ToListAsync(); [McpServerTool, Description(查询指定球队的平均年龄和平均身高)] public async Taskobject GetTeamStats(string team) { var q _db.Players.Where(p p.Team team); return new { Team team, AvgAge await q.AverageAsync(p p.Age), AvgHeight await q.AverageAsync(p p.HeightCm), Count await q.CountAsync() }; } [McpServerTool, Description(按平均年龄从大到小返回所有球队统计)] public async TaskListobject GetAllTeamsRankedByAge() await _db.Players.GroupBy(p p.Team) .Select(g new { Team g.Key, AvgAge g.Average(p p.Age), AvgHeight g.Average(p p.HeightCm) }) .OrderByDescending(x x.AvgAge) .ToListAsyncobject(); }3.5 Program.cs 注册 MCP 服务var builder WebApplication.CreateBuilder(args); builder.Services.AddDbContextAsiaCupContext(o o.UseSqlServer(builder.Configuration.GetConnectionString(AsiaCup))); builder.Services.AddMcpServer() .WithHttpTransport() .WithToolsPlayerTools(); var app builder.Build(); app.MapMcp(); app.Run();3.6 VS Code 侧 MCP 配置在 VS Code 的settings.json里加 MCP 服务端定义。如果你用的是 Cline 或 CC Switch 这类工具配置结构类似核心还是 Base URL Key Model ID 三件套{ mcp: { servers: { my-mcp-server: { type: http, url: http://localhost:4421/mcp } } } }如果 MCP 服务端内部还要调模型环境变量里带上{ env: { OPENAI_BASE_URL: https://taotoken.net/api, OPENAI_API_KEY: sk-你的Key, OPENAI_MODEL: claude-sonnet-4-5 } }3.7 把 MCP 工具挂进 chatmode回到亚洲杯球员分析.chatmode.md确认tools列表里有my-mcp-server。保存后在 Copilot 面板的 mode 下拉框里就能看到「亚洲杯球员分析」。鼠标悬停在工具集名称上会弹出它包含的三个工具GetPlayersByTeam、GetTeamStats、GetAllTeamsRankedByAge。4. 验证请求一次球员数据问答的完整过程配置完启动 MCP 服务端cd AsiaCupMcpServer dotnet run看到监听http://localhost:4421就说明起来了。4.1 选中自定义模式在 VS Code 的 Copilot 面板下方mode 下拉框选「亚洲杯球员分析」。这时 Copilot 已经带着那段 instructions 在工作了。4.2 问中国队输入「中国队」Copilot 会自动调用GetPlayersByTeam返回中国队参赛球员名单再调GetTeamStats给出平均年龄和平均身高。因为 instructions 里写了「统计数字保留一位小数」返回的格式是规整的。4.3 问排名输入「各国球员平均年龄和身高按平均年龄从大到小排序」Copilot 调GetAllTeamsRankedByAge返回排序后的列表。实测下来菲律宾队平均年龄超过 30 岁年龄最小的是新西兰和澳大利亚这两支大洋洲球队阵容年轻化明显。4.4 问中国台北队输入「中国台北队」返回平均身高相对其他队偏低中锋是规划球员高博凯队里有 3 名现役 CBA 球员胡珑贸此前也有 CBA 经历。4.5 验证成功的标志判断 MCP 是否真的被调用看两点一是 Copilot 回答里出现了工具调用卡片显示调用了哪个 tool二是回答里的数字和直接查数据库一致。如果只是模型自己编数字往往对不上或者格式不统一。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth配这套东西报错基本集中在几个地方逐个对照。5.1 401 Unauthorized最常见。原因通常是 Key 没填对或者 Base URL 写成了带路径的形式。检查Base URL 必须是https://taotoken.net/api不要写成https://taotoken.net/api/v1或带其他后缀。Key 是否完整复制有没有多余空格。如果 MCP 服务端读的是环境变量确认OPENAI_API_KEY真的被注入进去了可以在启动日志里打印一下前几位确认。5.2 local proxy failed这个报错一般出现在 VS Code 侧连 MCP 服务端时。原因多是 MCP 服务端没启动或者端口不对。检查dotnet run是否还在运行settings.json里的url端口是否和Program.cs里监听的一致。如果服务端监听的是https客户端却用http也会报这个。5.3 reading choices 相关报错这类报错通常出现在模型返回格式不符合预期时比如 MCP 工具返回了模型无法解析的结构。检查工具方法的返回类型尽量返回简单对象或列表避免嵌套过深。如果返回的是 EF Core 的跟踪实体先.Select成匿名对象再返回。5.4 OAuth 相关报错如果你在 MCP 配置里启用了 OAuth 认证但服务端没配对应的授权端点会报 OAuth 错误。本地开发阶段MCP 服务端用http 无认证最简单先跑通再考虑加认证。5.5 工具没被调用Copilot 回答正常但没调 MCP 工具通常是 chatmode 的tools列表里没写my-mcp-server或者工具方法的Description写得太模糊模型判断不出该不该调。把 description 写具体比如「查询指定球队的平均年龄和平均身高」比「获取统计」有效得多。5.6 三件套再核对一遍只要涉及模型调用Base URL、Key、Model ID 三样缺一不可。CC Switch、Cline MCP、Codex 的auth.json里都是这三个字段配的时候对照着填别只填两个。6. 把模型通道收敛到一处长期用起来更省事这套配置跑通之后你会发现真正的价值不在「问一次球员数据」而在于模式可以复用。下次想分析别的赛事改 chatmode 的 instructions 和 MCP 工具的数据源就行模型通道那层不用动。如果你打算长期在 VS Code 里做这类领域问答或者把 MCP 接到更多 Agent 工作流里可以考虑 Coding Plan把模型调用额度固定下来不用每次单独算。入口https://taotoken.net/coding-plan接入文档里对 Base URL、Key、Model ID 的说明最全配的时候对着看https://taotoken.net/doc想先验证模型通不通用模型对话页面最快https://taotoken.net/chatKey 管理在控制台https://taotoken.net/api-keys最后留一个我踩过的坑chatmode 文件保存后如果 Copilot 面板没刷新出新模式把 VS Code 窗口重载一下Developer: Reload Window比反复点下拉框管用。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑