【AgentScope Java新手村系列】(15)MCP协议工具

简介: MCP协议工具 — tools.json 一行声明一个 MCP server,支持 stdio/sse/ws 协议,McpMeta 传递调用元数据。

第十五章 MCP 协议工具:tools.json 声明式接入 MCP Server,配置即集成

"我们想把 GitHub MCP server、PostgreSQL MCP server、Slack MCP server 一起接进 agent。1.x 时代我们写 3 个 Tool 子类;2.0 用 workspace/tools.json 一行声明一个 MCP server,agent 启动时自动发现工具。这是 2.0 推荐的『配置即集成』。"

本章你将学到:MCP server 是什么、tools.json 里怎么写 MCP 段、如何在 Java 端补强 MCP、常见 MCP server 接入示例。

15.1 MCP 是什么?

Model Context Protocol(MCP) 是 Anthropic 在 2024 年推出的开放协议,让 LLM 应用以统一方式发现并调用外部工具。AgentScope 2.0 把 MCP server 作为 agent 工具的一种"来源"——你在 tools.json 里声明一个 MCP server,agent 启动时通过 stdiosse 协议连上它,自动把 server 暴露的工具当作 agent 自己的 tool。

15.2 第一个 MCP 集成

{
   
  "mcpServers": {
   
    "github": {
   
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
   
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${env:GITHUB_TOKEN}"
      }
    }
  }
}

HarnessAgent.builder().workspace(path) 启动时会自动扫描 workspace/tools.jsonmcpServers 段、连接每个 server、把工具注册到 agent——不需要额外开关

HarnessAgent agent = HarnessAgent.builder()
        ...
        .workspace(Path.of("./workspace"))
        .build();

跑起来后,agent 就能调用 GitHub MCP server 暴露的 create_issue / list_repos / search_code 等工具了。

15.3 三种连接方式

协议 适用 声明方式
stdio 本地进程,最常见 command + args
sse 远程 HTTP SSE server url + headers
ws 双向 WebSocket url + headers

stdio 例子:

{
   
  "mcpServers": {
   
    "filesystem": {
   
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "./data"]
    }
  }
}

sse 例子:

{
   
  "mcpServers": {
   
    "remote-knowledge": {
   
      "url": "https://mcp.example.com/sse",
      "headers": {
   
        "Authorization": "Bearer ${env:MCP_TOKEN}"
      }
    }
  }
}

15.4 不想写 JSON 文件?可以在 Java 代码里直接配

用 JSON 文件当然可以,但有时候你想在代码里动态拼参数——比如 token 从环境变量读、超时按环境切换。这时候直接用 ToolsConfig + McpServerConfig 在 Java 代码里配,效果和 tools.json 完全一样:

import io.agentscope.harness.agent.tools.McpServerConfig;
import io.agentscope.harness.agent.tools.ToolsConfig;

ToolsConfig cfg = new ToolsConfig();
Map<String, McpServerConfig> servers = new LinkedHashMap<>();

McpServerConfig github = new McpServerConfig();
github.setTransport("stdio");
github.setCommand("npx");
github.setArgs(List.of("-y", "@modelcontextprotocol/server-github"));
github.setEnv(Map.of(
        "GITHUB_PERSONAL_ACCESS_TOKEN", System.getenv("GITHUB_TOKEN")));
servers.put("github", github);

cfg.setMcpServers(servers);

HarnessAgent agent = HarnessAgent.builder()
        ...
        .toolsConfig(cfg)
        .build();

McpServerConfigio.agentscope.harness.agent.tools)支持 transport / command / args / env / url / headers / timeout 等字段,与 tools.jsonmcpServers 段一一对应。

15.5 与 Permission 协作

MCP 工具默认会经过 Permission 系统——你可以在 rule 里直接写 MCP 工具名:

PermissionContextState perms = PermissionContextState.builder()
        .mode(PermissionMode.ACCEPT_EDITS)                   // 大部分操作直接放行
        .addAskRule("create_issue",                          // create_issue 是 MCP GitHub server 的工具
                new PermissionRule("create_issue", null,
                        PermissionBehavior.ASK, "userSettings"))  // 建 Issue 前要弹窗问用户
        .addDenyRule("drop_table",                           // drop_table 是本地工具
                new PermissionRule("drop_table", null,
                        PermissionBehavior.DENY, "userSettings")) // 删表直接拒绝
        .build();

MCP 工具和本地 @Tool 工具在 Permission 系统里地位完全平等——create_issue(来自 GitHub MCP server)和 drop_table(来自本地 Java 类)同等待遇。

15.6 常见 MCP server 一览

名称 工具集
@modelcontextprotocol/server-github 仓库、Issue、PR
@modelcontextprotocol/server-filesystem 读、写、列目录
@modelcontextprotocol/server-postgres 查 SQL、DDL
@modelcontextprotocol/server-slack 发消息、查频道
@modelcontextprotocol/server-puppeteer 浏览器自动化
@modelcontextprotocol/server-git git 操作

完整列表见 MCP 官方 server 仓库

15.7 工具命名冲突

如果两个 MCP server 都暴露了同名工具,AgentScope 会按下列优先级保留一个:

  1. Toolkit 中 Java 端注册的工具(最高)
  2. 第一个启动成功的 MCP server
  3. 后面的同名工具被忽略 + 启动日志里 WARN

要避免冲突:用 toolFilter 限定:

{
   
  "mcpServers": {
    "...": "..." },
  "toolFilter": {
   
    "deny": ["github_legacy_*"]
  }
}

15.8 完整可运行示例

这个例子在演示什么?

你有一个 devops agent,可以查 GitHub Issue 和操作本地文件。生产环境通过 workspace/tools.json 声明两个 MCP server(GitHub、Filesystem);开发环境先用 @Tool 模拟 MCP 行为,避免依赖外部进程。两种方式代码结构相同,仅工具来源不同。

public class Chapter15_McpTools {
   

    // Mock MCP GitHub server 工具
    public static class MockGitHubTools {
   
        @Tool(name = "create_issue", description = "创建 GitHub Issue")
        public String createIssue(String repo, String title) {
   
            return "Issue \"" + title + "\" 已创建到 " + repo + "。";
        }

        @Tool(name = "list_repos", description = "列出用户的仓库")
        public String listRepos() {
   
            return "- agentscope/agentscope-java\n- agentscope/agentscope-python";
        }

        @Tool(name = "search_code", description = "在代码仓库中搜索")
        public String searchCode(String query) {
   
            return "搜索 \"" + query + "\" 的结果。";
        }
    }

    // Mock MCP Filesystem server 工具
    public static class MockFilesystemTools {
   
        @Tool(name = "read_file", description = "读取文件内容")
        public String readFile(String path) {
   
            return "文件 " + path + " 的内容。";
        }

        @Tool(name = "list_directory", description = "列出目录内容")
        public String listDirectory(String path) {
   
            return "目录 " + path + " 的内容。";
        }
    }

    public static void main(String[] args) {
   
        Toolkit toolkit = new Toolkit();
        toolkit.registerTool(new MockGitHubTools());
        toolkit.registerTool(new MockFilesystemTools());

        HarnessAgent agent = HarnessAgent.builder()
                .name("devops")
                .sysPrompt("你是一个 devops 助理,可以查 GitHub issue 和操作本地文件。")
                .model(model())
                .workspace(Path.of("./workspace"))
                .toolkit(toolkit)
                .build();

        agent.call(
                List.of(new UserMessage("user",
                        "看看 agentscope/agentscope-java 最近有什么 Issue。")),
                RuntimeContext.empty())
                .block();
    }
}

workspace/tools.json(生产环境用,替代上面 Java 端的 mock):

{
   
  "mcpServers": {
   
    "github": {
   
      "transport": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
   
        "GITHUB_PERSONAL_ACCESS_TOKEN": "${env:GITHUB_TOKEN}"
      }
    },
    "filesystem": {
   
      "transport": "stdio",
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-filesystem", "./data"]
    }
  }
}

开发时用 @Tool mock,生产时去掉 mock 换成 tools.json——业务代码完全不变,只改工具来源。

15.9 MCP Tool Meta:在工具调用中传递元数据

RC2 新增 McpMeta 机制——你可以在 RuntimeContext 中放入元数据(traceId、userId、回调地址等),框架自动在 MCP CallToolRequestmeta 参数中原样传递。

import io.agentscope.core.tool.mcp.McpMeta;

// 把 traceId 和 callbackUrl 放进 McpMeta
McpMeta meta = new McpMeta(Map.of(
        "traceId", "abc-123",                                  // 链路追踪 ID
        "callbackUrl", "https://hook.example.com/cb"           // 结果回调地址
));

RuntimeContext ctx = RuntimeContext.builder()
        .put(McpMeta.class, meta)                               // 注入 RuntimeContext
        .build();

// 当 agent 调 MCP 工具时,meta 自动透传给 MCP server
agent.call(List.of(new UserMessage("user", "创建 issue")), ctx).block();

当 agent 调用 MCP 工具时,traceIdcallbackUrl 会自动出现在 MCP server 收到的 meta 参数中。MCP server 可用这些 meta 做日志关联、结果推送等。

只实现了 McpMeta 接口的对象才会被提取——普通 RuntimeContext 条目不会泄露给 MCP server。

15.10 本章小结

  • MCP server 通过 stdio / sse / ws 接入 agent。
  • workspace/tools.jsonmcpServers 段声明,运行时可改。
  • Java 端 McpServerSpec 可补强:超时、env、headers。
  • MCP 工具与 Permission 系统无缝集成。
目录
相关文章
|
6天前
|
人工智能 定位技术 SEO
我学 GEO 第 15 天:终于知道AI GEO该如何做?
我是暴走的莉莉酱,边旅行边研究AI GEO的数字游民。专注普通人如何提升“AI可见度”——让AI在回答用户问题时准确识别、理解并推荐你。不讲玄学,只做可测、可调、可持续的GEO实践。
421 125
|
8天前
|
机器学习/深度学习 人工智能 调度
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
HappyHorse 1.1 是新一代视频生成大模型,全面升级动态表现力、角色一致性、指令遵循、视觉质感与音画协同能力。支持I2V/T2V/R2V三类生成,适配短剧、电商广告、品牌营销等场景,提供高质、流畅、可控的AI视频生产力。
713 5
🐴 HappyHorse 1.1 现已上线阿里云百炼!快来查收模型使用指南,现在调用享 6 折~
|
6天前
|
缓存 人工智能 运维
阿里云618百炼大模型Qwen3.7-Max功能、免费试用、订阅计费、配置接入详解
Qwen3.7-MAX是阿里云百炼平台推出的通义千问3.7系列旗舰大语言模型,专为智能体时代复杂任务打造,依托阿里云全域算力与自研技术,在逻辑推理、长文本处理、代码工程、长周期自主执行等领域达到行业顶尖水平。2026年618期间,该模型推出多重免费试用权益、按量计费5折、订阅套餐优惠等专属福利,覆盖个人开发者、团队与企业全场景需求,以下从核心功能、免费试用、订阅计费、配置接入四方面展开详细解析。
416 123
|
4天前
|
人工智能 自然语言处理 API
阿里云Token Plan团队版解析:功能、三档套餐与省钱订阅指南
阿里云百炼平台推出的Token Plan团队版,是面向企业与团队的AI大模型订阅服务,以Credits为统一计量单位,整合文本与图像生成模型,提供团队管理、数据安全、多工具兼容等核心能力,解决团队零散订阅AI服务的管理混乱、成本失控、数据安全等痛点。本文将从核心定位、套餐详情、计费规则、团队管理、工具兼容、便宜订阅技巧等方面,全面解析Token Plan团队版,帮助企业与团队高效、低成本地使用AI服务。
309 108
|
5天前
|
存储 人工智能 数据可视化
别再手动复制 Skill 了:多 Agent 时代的 Skill 管理方案
多 Agent 场景下 Skill 的统一管理与同步。
261 123
|
19天前
|
缓存 测试技术 API
Qwen 3.7 Plus 与 Max 实测:性价比与多模态能力差异解析(2026)
2026 年 6 月 1 日,阿里悄无声息地发布了 Qwen 3.7 Plus,距 Qwen 3.7 Max 上线刚好 11 天。同样的 1M 上下文,同样的 35 小时自治上限。但价格才是头条:Plus 是 0.40/M输入,Max是 2.50/M——便宜约 6 倍——并且还能看图、看视频。Vision Arena 上 Plus 已经排到 #16。所以这周真正值得讨论的问题不是”要不要为视觉能力买单”,而是”Max 凭什么用 6 倍价格换来 2 个百分点的 benchmark 领先”。
|
12天前
|
缓存 人工智能 运维
GLM 5.2自托管全流程实战:硬件选型、vLLM/SGLang部署与成本盈亏测算
2026年智谱发布GLM 5.2超大混合专家模型,区别于以往仅开放API的闭源大模型,该模型权重以MIT开源协议对外发布,企业与开发者可完整下载、本地审计、私有化部署,实现数据不出环境、自定义微调、自主调度推理资源。GLM 5.2拥有753B总参数,原生支持百万级上下文窗口,在代码生成、长文档推理、数学逻辑等多项基准测试中对标国际顶尖商用模型,是首款可完整自托管的前沿代码向大模型。
939 0
|
13天前
|
Linux 程序员 数据格式
【2026最新】Notepad++下载、安装和使用一篇搞定(附中文版安装包)
Notepad++ 是一款免费开源、轻量高效的 Windows 文本编辑器,支持 C/Python/HTML 等 80+ 语言语法高亮、代码折叠、正则替换、编码转换及插件扩展,专为程序员与文本处理用户打造,完美替代系统记事本。(239字)

热门文章

最新文章