# Tencent Survey

> 腾讯问卷（wj.qq.com）- 在线问卷调查平台。涉及「问卷」「调查」「表单」「投票」「考试」「测评」「wj.qq.com」等操作时优先使用。支持能力：(1) 获取问卷详情（标题、设置、页面、题目、选项完整结构 + 纯文本 DSL）(2) 使用纯文本创建问卷（text 必填，支持指定场景/指定项目）(3) 更新问卷中的单个题目（DSL 格式）(4) 获取问卷回答列表（支持游标分页）。支持场景：调查(1)、考试(3)、测评(6)、投票(8)。

- Skill: `bighardperson/tencent-survey` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds@latest add bighardperson/tencent-survey`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bighardperson/tencent-survey/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: bighardperson (https://skillmd.com/u/bighardperson)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/bighardperson/tencent-survey

---


# SKILL 更新

每天使用 SKILL 前进行一次更新检查，按照如下的步骤执行:

1. **查看当前版本version**：读取本文件顶部 frontmatter 中的 `version` 字段；格式为 MAJOR.MINOR.PATCH
2. **查看最新版本latest**：通过命令获取最新版本信息`latest`，输入参数 `current_version` 为上一步获取的当前版本
```bash
mcporter call tencent-survey "check_skill_update" --args '{"current_version": "当前版本"}'
```
JSON 格式数据返回，返回参数示例：
- `has_update`: 是否有更新（true/false）
- `latest`: 最新版本号，格式为 MAJOR.MINOR.PATCH
- `current_version`: 当前传入的版本号
- `release_note`: 最新版本发布说明
- `instruction`: 更新指令

3. **更新版本**：如果 `has_update` 为 true（即当前版本`current_version`低于最新版本`latest`），则遵循 `instruction` 指令进行更新，或提示用户更新

# 腾讯问卷 MCP 使用指南

腾讯问卷 MCP 提供问卷查询、创建、编辑与回答查看能力，让 AI 助手可以直接操作问卷系统。

## 触发场景

### 明确触发

以下情况应直接激活本 skill：
- 用户提到「问卷」「调查」「表单」「投票」「考试」「测评」等关键词
- 用户提供了 `wj.qq.com` 链接
- 用户说「帮我做个调查」「创建一个投票」等

### 模糊场景

| 用户表述 | 判断方式 |
|---------|---------|
| 「帮我做个投票」 | 直接使用本 skill，scene=8 |
| 「做个考试」 | 直接使用本 skill，scene=3 |
| 「做个测评」 | 直接使用本 skill，scene=6 |
| 「收集一下大家的意见」 | 直接使用本 skill，scene=1（调查） |
| 「我有个问卷链接…」 | 解析链接提取 survey_id，调用 get_survey |
| 「修改问卷的第X题」 | 先 get_survey 获取 question_id，再 update_question |
| 「看看问卷的回答」 | 调用 list_answers，注意翻页获取全部数据 |
| 「问卷收了多少份」 | 调用 list_answers 查看 total 字段 |

## 配置

**在本次会话首次调用工具前**，完成一次鉴权检查（完整流程见 `references/auth.md`）：

> `${SKILL_DIR}` 为本 skill 所在目录路径（即 `SKILL.md` 所在目录）。由 AI Agent 框架在加载 skill 时自动注入；如果框架未注入，请替换为 `SKILL.md` 所在目录的绝对路径。

### 方式一：环境变量传入 Token

如果已有 Token（环境变量 `TENCENT_SURVEY_TOKEN`），直接完成配置，无需 OAuth 授权：

```bash
TENCENT_SURVEY_TOKEN=xxx bash "${SKILL_DIR}/setup.sh" wj_check_and_start_auth
```

脚本检测到 `TENCENT_SURVEY_TOKEN` 后会自动写入 mcporter 配置，输出 `READY` 即表示就绪。

### 方式二：OAuth 设备授权

未设置 `TENCENT_SURVEY_TOKEN` 时，自动进入 OAuth 授权流程：

1. 执行 `bash "${SKILL_DIR}/setup.sh" wj_check_and_start_auth`
2. 输出 `READY` → 鉴权已就绪，直接继续
3. 输出 `AUTH_REQUIRED:<url>` → 向用户展示授权链接，然后执行 `bash "${SKILL_DIR}/setup.sh" wj_wait_auth` 等待授权完成
4. 输出 `ERROR:*` → 告知用户对应错误

> 鉴权通过后，**同一会话内后续调用无需重复检查**。仅当工具返回 `invalid_token`、`token expired`、`missing_token` 等鉴权错误时，才需要重新执行上述流程。

- Token 前缀固定为 `wjpt_`，长度 70 字符
- 每个 Token 绑定一个团队，只能操作该团队下的问卷

## 工具列表与调用方式

| 工具名称 | 功能说明 | 参考文档 |
|---------|---------|---------|
| get_survey | 获取指定问卷的详细信息（标题、设置、页面、题目、选项 + 纯文本 DSL） | `references/get_survey.md` |
| create_survey | 使用纯文本创建问卷（text 必填，支持指定场景/指定项目） | `references/create_survey.md` |
| update_question | 更新问卷中的某一道题目（需先获取 question_id） | `references/update_question.md` |
| list_answers | 获取问卷的回答列表（支持游标分页） | `references/list_answers.md` |
| check_skill_update | 检查 Skill 是否有新版本可更新 | 见上方「SKILL 更新」章节 |

调用优先级：

1. **MCP 原生调用**：如果当前 AI Agent 已通过 MCP 协议连接了 tencent-survey 服务（工具列表中可见 `get_survey`、`create_survey`、`update_question`、`list_answers`），直接调用工具即可
2. **mcporter CLI 调用**：如果 AI Agent 不支持 MCP 原生调用，或工具列表中未出现 tencent-survey 工具，通过终端执行 `mcporter call tencent-survey.<tool_name> --args '{...}'`
3. **确认工具可用**：使用 `mcporter list tencent-survey` 查看已注册的工具列表和参数 Schema

> 参考文档中的参数说明应与 MCP 工具 Schema 保持一致。如有冲突，以 `mcporter list tencent-survey` 返回的 Schema 为准。

## URL 解析规则

问卷投放链接格式为 `https://wj.qq.com/s2/{survey_id}/{hash}`

当用户提供链接时，取路径第二段为 `survey_id`：

| URL 格式 | 提取方式 | 示例 |
|----------|---------|------|
| `wj.qq.com/s2/{id}/{hash}` | 取路径第二段为 survey_id | `wj.qq.com/s2/292192/abc1` → `292192` |

> 提取到 `survey_id` 后，调用 `get_survey(survey_id=...)` 获取问卷详情。

## 数据模型

```
问卷（Survey）
├── 基本信息：id, hash, title, scene, state
├── 设置：prefix(欢迎语), suffix(结束语), started_at, end_at ...
├── 项目：project { id, name }
├── 纯文本内容：text（DSL 格式，包含标题和所有题目）
├── 页面列表（Pages[]）
│   └── 题目列表（Questions[]）
│       ├── 基本属性：id, type, sub_type, title, required
│       ├── 选项列表（Options[]）：id, text, exclusive
│       ├── 量表属性：starBeginNum, starNum
│       ├── 矩阵子问题：subTitles[]
│       └── 联动层级：levels[], groups[]
└── 回答列表（Answers[]）← 通过 list_answers 获取
    ├── 基本信息：answer_id, respondent_nickname, started_at, ended_at
    ├── 地理信息：country, province, city
    └── 回答内容（answer[]）
        └── 页面 → 题目回答 { id, type, text, options, blanks, groups }
```

> 核心嵌套关系：`Survey → Pages[] → Questions[] → Options[]`
> 回答嵌套关系：`Answer → answer[] (Pages) → questions[]`

## 常见工作流

### 查看问卷详情

参考文档：`references/get_survey.md`

1. 执行鉴权检查（见上方「配置」节）
2. 从用户提供的链接或 ID 获取 `survey_id`（链接解析见「URL 解析规则」）
3. 调用 `get_survey(survey_id=...)` 获取问卷详情
4. 递归解析 `pages → questions → options` 嵌套结构
5. 向用户展示问卷标题、题目列表等信息

### 创建问卷

参考文档：`references/create_survey.md`

1. 执行鉴权检查（见上方「配置」节）
2. 根据用户需求判断 `scene`：调查(1, 默认)、考试(3)、测评(6)、投票(8)
3. 按问卷文本语法组织 `text` 内容（语法详见参考文档）
4. 如果用户指定了项目，传入 `project_id`
5. 调用 `create_survey` 创建问卷
6. 从返回结果中取 `survey_id` 和 `hash`，拼接投放链接 `wj.qq.com/s2/{survey_id}/{hash}` 告知用户
7. 可选：调用 `get_survey` 确认问卷结构

### 更新问卷题目

参考文档：`references/update_question.md`

1. 执行鉴权检查（见上方「配置」节）
2. 调用 `get_survey(survey_id=...)` 获取问卷详情
3. 从返回的 `pages → questions` 中找到目标题目的 `id`（格式如 `q-1-xxxx`）
4. 参考返回的 `text` 字段了解当前问卷的 DSL 格式
5. 按 DSL 语法编写新的题目文本（只写这一道题，不需要问卷标题）
6. 调用 `update_question(survey_id=..., question_id=..., text=...)` 更新题目
7. 可选：再次调用 `get_survey` 确认更新结果

### 查看问卷回答

参考文档：`references/list_answers.md`

1. 执行鉴权检查（见上方「配置」节）
2. 调用 `list_answers(survey_id=...)` 获取首页回答
3. **⚠️ 注意翻页**：如果 `list.length == per_page`，说明可能还有下一页，需要循环翻页：
   - 将返回的 `last_answer_id` 作为下一次请求的参数
   - 继续调用 `list_answers(survey_id=..., last_answer_id=...)` 获取下一页
   - 直到 `list.length < per_page` 表示已到最后一页
4. 解析每条回答的 `answer` 字段（嵌套结构：`页面 → 题目回答`）
5. 向用户展示回答汇总或详情

## 注意事项

- **标题可能含 HTML 标签**：`get_survey` 返回的 `title` 字段可能包含 `<p>`、`<br>` 等标签，展示给用户前需清理
- **text 字段（DSL 格式）**：`get_survey` 返回的 `text` 字段是纯文本 DSL 格式的问卷内容，可作为 `update_question` 的参考
- **text 参数格式**：`create_survey` 和 `update_question` 的 `text` 为必填，JSON 中换行使用 `\n`，选项不需要字母前缀（写 `满意` 而非 `A. 满意`）
- **update_question 需先获取 question_id**：必须先调用 `get_survey` 获取题目列表，不能自行构造 question_id
- **list_answers 需要翻页**：回答列表使用游标分页，如果回答数量超过 `per_page`（默认 20），必须循环调用直到获取完所有数据
- **非幂等的写操作**：`create_survey` 每次调用都会创建新问卷，`update_question` 每次调用都会覆盖原题目

## 问题定位指南

### 常见错误码

| 错误码 | 错误类型 | 解决方案 |
|--------|---------|---------|
| `missing_token` | 请求未携带 Token | 检查 Authorization Header 或 access_token 参数 |
| `invalid_token_prefix` | Token 前缀错误 | 确认使用 `wjpt_` 开头的 Token |
| `invalid token` | Token 不存在或已撤销 | 重新创建 Token |
| `token expired` | Token 已过期 | 重新授权，详见 `references/auth.md` |
| `claim_error` | 问卷不属于当前团队 | 确认问卷 ID 正确且属于当前 Token 绑定的团队 |
| `invalid_text_format` | 文本格式错误（create_survey / update_question） | 检查 text DSL 语法 |
| `survey_not_editable` | 问卷不可编辑（update_question） | 问卷可能正在回收中，需先暂停 |

### 排查步骤

1. **检查错误信息**：查看返回的 error 字段，确定错误类型
2. **检查请求参数**：确认 `survey_id` 等参数值正确
3. **阅读参考文档**：`references/` 目录下包含所有工具的参数说明
4. **获取工具列表**：使用 `mcporter list tencent-survey` 确认工具是否可用

