---
title: 接入只读 MCP 工具
description: 用完整客户端读取一份资料，再验证错误请求被拒绝。
lastVerified: 2026-10-23
---

# 6.7 接入只读 MCP 工具

本篇用 Teloa 源码自带的资料服务，完成工具发现、读取和拒绝测试。它通过 stdio 运行，不调用模型，也不读取私人目录。要开发 HTTP MCP 服务，直接使用[应用教程](https://docs.teloa.ai/v/0.2.12/markdown/develop/apps.md)的完整例子。

## 准备文件

需要 Node.js 24，以及已按[源码环境](https://docs.teloa.ai/v/0.2.12/markdown/develop/local-development.md)安装依赖的 Teloa 源码目录。服务入口为 `packages/mcp-reference/src/main.ts`。

[下载完整客户端示例](https://docs.teloa.ai/v/0.2.12/examples/developer-toolkit-028.zip)，解压后在示例目录执行：

```sh
npm install
node reference-client.mjs /absolute/path/to/teloa
```

把最后一个参数换成你实际的 Teloa 源码绝对路径。客户端启动服务并自动关闭；只手动运行服务时，它会等待 MCP 消息，没有聊天提示属于正常状态。

## 客户端怎样读取

`reference-client.mjs` 已包含完整导入、连接和退出处理，核心调用如下：

```js
const listing = await client.callTool({name: 'list_references', arguments: {}})
const ref = listing.structuredContent.references[0]
const read = await client.callTool({
  name: 'read_reference',
  arguments: {id: ref.id, version: ref.version},
})
console.log(read.structuredContent.text)
```

列表返回开放资料的 ID、来源和 SHA-256 版本；读取必须沿用该版本。客户端会输出一份实际正文及版本，再输出三条被拒绝的请求。

| 测试 | 预期结果 |
| --- | --- |
| 列举资料 | 返回 `workbench`、`capabilities` 两个 ID |
| 读取列表给出的 ID 和版本 | 返回正文、来源和同一版本 |
| 不存在的 ID | `reference/not-found` |
| 错误的 64 位版本 | `reference/version-conflict` |
| 额外传入 `path` | 参数校验失败，不读取该路径 |

可在 Teloa 源码根目录运行同一服务的协议测试：

```sh
pnpm test:references
```

## 在员工中使用

默认组合登记了 `teloa_reference` 服务。先核对服务已连接，再给测试员工选择实际发现的读取工具；暂停员工、修改授权并恢复在岗后发起新的测试任务。当前完整工具名为 `mcp__teloa_reference__list_references` 和 `mcp__teloa_reference__read_reference`。

同一任务先测未授权拒绝，再测授权后读取；检查轨迹中的实际调用和回包。协议客户端通过，只证明服务边界；员工是否可以使用，还要经过岗位和任务授权。

## 改成自己的资料服务

在服务端维护允许读取的资料清单，只接受资料 ID 和版本，不接受任意磁盘路径。先列举再按版本读取，资料变化时要求调用方重新核对。额外覆盖缺文件、编码错误、过大文件、权限撤回和停止。

服务端实现见 `packages/mcp-reference/src/server.ts`、`catalog.ts`。接入真实系统前，按[授权边界](https://docs.teloa.ai/v/0.2.12/markdown/develop/permissions.md)完成服务账号和对象权限测试。
