Atlas / MCP servers / wjxcom / wjx-ai-kit

wjx-ai-kitBLOCK

mcp/wjxcom/wjx-ai-kit

问卷星 OpenAPI 全栈工具包:TypeScript SDK + MCP Server + CLI

Verdict
BLOCK
Grade
F
Trust score
51 /100
Exposed tools
66 35r · 22w · 9d
Transport
stdio · streamable-http
License
MIT
Stars
18
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

问卷星官方开源 AI 工具包:SDK 提供共享业务基础层,CLI 是完整的主入口,MCP Server 提供面向原生 MCP 客户端的核心业务子集。

从这里开始

CLI 是默认入口:它不要求客户端支持 MCP,适合 AI Agent、自动化脚本和人工终端操作。MCP 处于 secondary / maintenance-mode 定位,只覆盖核心业务子集;初始化、诊断、profile、补全、参考/schema、更新和 Skill 安装保持 CLI-only。SDK 用于程序化集成;Agent/Skill 只是工作流层,不是独立 API 层。完整差异见 能力矩阵。

安装

当前源码版本为 0.4.5。发布到 npm 后,registry 的 latest 将指向 0.4.5。直接安装 CLI:

通过 AI 安装并启用 wjx-cli:先执行 npm install -g wjx-cli@latest,成功后再执行 wjx skill install --force;安装后命令名是 wjx,请用 wjx --version 验证,不要运行 wjx-cli --version。
npm install -g wjx-cli@latest
wjx skill install --force
wjx init --api-key "你的问卷星 API Key"
wjx doctor

让 AI 自动完成安装

把下面整段话发给你的 AI 助手。它应按顺序执行,拿到 API Key 前暂停等待,不要跳过最后的连接验收:

请帮我安装并配置问卷星 CLI(wjx-cli):

0. 预检当前操作系统和 shell。检查 `node --version`、`npm --version`,并在命令可用时先检查 `wjx --version`。Windows 还要用 `Get-Command node,npm,wjx -ErrorAction SilentlyContinue`、`where.exe node`、`where.exe npm`、`where.exe wjx`,并检查 `C:\Program Files\nodejs\node.exe` 和 `%LOCALAPPDATA%\Programs\nodejs\node.exe`。同时记录 `npm prefix -g`,确认 npm 全局 bin 在当前 PATH。一个 shell 报“找不到命令”不能证明软件未安装。

1. 若绝对路径能找到 Node.js,直接用该路径验证版本;若只是当前 shell 的 PATH 未刷新,刷新 PATH 或启动新的 shell 后重新检查。只有确认 Node.js 不存在时才引导我从 https://nodejs.org 安装 LTS;版本低于 20 时停止并引导升级。不要在证据不足时运行 winget、安装器或后台安装进程。安装/升级后必须在新进程再次验证 `node --version` 和 `npm --version`。

2. Node.js >= 20 且 npm 可用后,先检查 `wjx --version`。若 wjx 已存在且版本 >= 0.4.1,跳过重复安装;若 wjx 缺失、版本过低或执行失败,才执行 `npm install -g wjx-cli@latest`。npm 包名是 `wjx-cli`,安装后的命令名是 `wjx`;npm 退出码为 0 不等于安装完成,必须刷新 PATH(如有需要)并再次运行 `wjx --version`。每个命令都要读取自身的真实退出码,不要用 `head`/`tail` 管道的退出码代替。禁止运行 `wjx-cli --ver
Read from source at commit d405ad5ab955OBSERVED · 2026-10-10
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add wjx-survey-ppt --env MCP_AUTH_TOKEN=${MCP_AUTH_TOKEN} --env MCP_LEGACY_BEARER_API_KEY=${MCP_LEGACY_BEARER_API_KEY} --env WJX_API_KEY=${WJX_API_KEY} --env WJX_APP_KEY=${WJX_APP_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "wjx-survey-ppt": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "MCP_AUTH_TOKEN": "${MCP_AUTH_TOKEN}",
        "MCP_LEGACY_BEARER_API_KEY": "${MCP_LEGACY_BEARER_API_KEY}",
        "WJX_API_KEY": "${WJX_API_KEY}",
        "WJX_APP_KEY": "${WJX_APP_KEY}"
      }
    }
  }
}
03

Exposed tools (66)

35 read · 22 write · 9 destructive. Blast radius: 9 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
add_adminwrite
add_contactswrite
add_departmentwrite
add_participantswrite
add_sub_accountwrite
add_tagwrite
bind_activityread
build_preview_urlread
build_submit_templatewrite
build_survey_urlread
calculate_csatread
calculate_npsread
clear_recycle_bindestructive
clear_responsesdestructive
compare_metricsread
count_responsesread
create_ai_pagewrite
create_survey_by_jsonwrite
create_survey_from_definitionwrite
decode_push_payloadwrite
decode_responsesread
delete_admindestructive
delete_contactsdestructive
delete_departmentdestructive
delete_participantsdestructive
delete_sub_accountdestructive
delete_surveydestructive
delete_tagdestructive
detect_anomaliesread
download_responsesread
generate_wjx_dslread
get_360_reportread
get_configread
get_question_tagsread
get_reportread
get_short_linkread
get_surveyread
get_survey_settingsread
get_tag_detailsread
get_winnersread
list_departmentsread
list_surveysread
list_tagsread
modify_departmentwrite
modify_participantswrite
modify_responsewrite
modify_sub_accountwrite
modify_tagwrite
query_contactsread
query_responsesread
query_responses_realtimeread
query_sub_accountsread
query_survey_bindingread
query_user_surveysread
query_wjx_dslread
restore_adminread
restore_sub_accountread
sso_partner_urlread
sso_subaccount_urlread
sso_user_system_urlread
submit_responsewrite
update_ai_pagewrite
update_survey_from_definitionwrite
update_survey_settingswrite
update_survey_statuswrite
upload_filewrite
04

Trust audit

BLOCKgrade F · trust 51/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (7 observation(s))
Network
declared (6 observation(s))
Shell
declared (5 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHPrivilege escalation / persistence · priv.escalate · CWE-269, CWE-250
skills/wjx-cli-use/setup.sh:248
if command -v sudo &> /dev/null && sudo "$NPM_BIN" install -g wjx-cli@latest; then
Why it matters. asks for elevated privileges
HIGHPrivilege escalation / persistence · priv.escalate · CWE-269, CWE-250
skills/wjx-cli-use/setup.sh:319
echo "  Ubuntu:   curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs"
Why it matters. asks for elevated privileges
HIGHPrivilege escalation / persistence · priv.escalate · CWE-269, CWE-250
skills/wjx-cli-use/setup.sh:320
echo "  CentOS:   curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - && sudo yum install -y nodejs"
Why it matters. asks for elevated privileges
HIGHPrivilege escalation / persistence · priv.escalate · CWE-269, CWE-250
skills/wjx-cli-use/setup.sh:356
print_info "尝试 sudo..."
Why it matters. asks for elevated privileges
HIGHPrivilege escalation / persistence · priv.escalate · CWE-269, CWE-250
skills/wjx-cli-use/setup.sh:357
if command -v sudo &> /dev/null; then
Why it matters. asks for elevated privileges
HIGHPrompt injection · prompt.zero_width · CWE-94, CWE-1427
wjx-cli/CHANGELOG.md:86
- **`isAiAgentEnv()` 扩展**:识别 wjx-docs 中提及的全部 AI Agent 场景(Claude Code/Desktop、Cursor、Windsurf、Cline、Copilot、Trae、Gemini、Qoder、各类 Claw/工作台)。
Why it matters. invisible characters in instruction text
Fix. strip non-printing characters
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
wjx-cli/dist/commands/response.js:366
submitdata = readFileSync(fileOpt, "utf8").replace(/^/, "").trimEnd();
MEDIUMObfuscation / stealth · obf.zero_width · CWE-506, CWE-94
wjx-cli/src/commands/response.ts:381
submitdata = readFileSync(fileOpt, "utf8").replace(/^/, "").trimEnd();
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
wjx-mcp-server/__tests__/blackbox-completeness-evaluation.test.mjs:334
setCredentialProvider(() => ({ apiKey: "mcp-invalid-version-key" }));
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
wjx-mcp-server/__tests__/blackbox-completeness-evaluation.test.mjs:361
setCredentialProvider(() => ({ apiKey: "mcp-explicit-version-key" }));
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
wjx-mcp-server/__tests__/blackbox-completeness-evaluation.test.mjs:402
setCredentialProvider(() => ({ apiKey: "mcp-explicit-version-failure-key" }));
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
clear_recycle_bin, clear_responses, delete_admin, delete_contacts, delete_department, delete_participants, delete_sub_account, delete_survey, delete_tag
Why it matters. 9 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
wjx-api-sdk/__tests__/analytics-compute.test.mjs:401
const md5Hex = createHash("md5").update(appKey, "utf-8").digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
wjx-api-sdk/__tests__/analytics-compute.test.mjs:433
const signature = createHash("sha1").update(rawBody + appKey, "utf-8").digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
wjx-api-sdk/dist/modules/analytics/push-decode.js:14
const md5Hex = createHash("md5").update(appKey, "utf-8").digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
wjx-api-sdk/dist/modules/analytics/push-decode.js:39
const expected = createHash("sha1").update(rawBody + appKey, "utf-8").digest("hex");
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
wjx-api-sdk/src/modules/analytics/push-decode.ts:21
const md5Hex = createHash("md5").update(appKey, "utf-8").digest("hex");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
wjx-api-sdk/dist/core/api-client.js:5
const packageJson = require("../../package.json");
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
wjx-api-sdk/dist/modules/contacts/client.d.ts:1
import type { WjxApiResponse, WjxCredentials, FetchLike } from "../../core/types.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
wjx-api-sdk/dist/modules/contacts/client.js:1
import { Action } from "../../core/constants.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
wjx-api-sdk/dist/modules/contacts/client.js:2
import { callWjxContactsApi, getWjxCredentials, getCorpId } from "../../core/api-client.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
wjx-api-sdk/dist/modules/dsl/client.d.ts:1
import type { FetchLike, WjxApiResponse, WjxCredentials } from "../../core/types.js";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
wjx-cli/__tests__/agent-workflow-golden.test.mjs:64
origin = "http://127.0.0.1",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
wjx-cli/__tests__/command-matrix-evaluation.test.mjs:578
WJX_API_URL: "http://127.0.0.1:1/openapi/default.aspx",
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
wjx-cli/__tests__/command-matrix-evaluation.test.mjs:1281
env: { WJX_CONFIG_PATH: configPath, WJX_API_URL: "http://127.0.0.1:1/openapi/default.aspx" },

Gates applied: no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha d405ad5ab955full audit observations/trust-audit/mcp-server/wjxcom__wjx-ai-kit.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10d405ad5ab955BLOCKF51first audit
06

Questions

What is the wjx-ai-kit MCP server?

问卷星 OpenAPI 全栈工具包:TypeScript SDK + MCP Server + CLI

What tools does wjx-ai-kit expose?

66 in total: 35 read-only, 22 that write, and 9 that can delete or overwrite (clear_recycle_bin, clear_responses, delete_admin, delete_contacts, delete_department). Every one is listed on this page with its risk.

Is wjx-ai-kit safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (51/100) and found 6 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 9 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does wjx-ai-kit need?

It reads MCP_AUTH_TOKEN, MCP_LEGACY_BEARER_API_KEY, WJX_API_KEY and WJX_APP_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does wjx-ai-kit run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as wjx-survey-ppt at 0.1.0.

How current is this page?

The grade is for one exact copy of the source (d405ad5ab955), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement