# FormLM (npm · @formlm/cli)

Build AI-powered forms, scored assessments and professional reports on FormLM, by natural language.

- Trust score: 70/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- npm · `@formlm/cli`: 70/100 (this document), [markdown](https://verifymcp.io/servers/me-formlm-cli/formlm-cli.md), [page](https://verifymcp.io/servers/me-formlm-cli/formlm-cli)

## Channel facts

- Registry: `npm`
- Package: `@formlm/cli`
- Version: `0.5.4`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 81/100
  - No malware found by supply-chain analysis.
  - CVE check failed: a known high-severity CVE affects zod 3.25.76, a direct dependency. A fixed version is available.
  - No install/post-install scripts declared.
  - 30 of 94 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 19/100
  - Repository check failed: the declared repository URL returned HTTP 404.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 25 days ago).
  - Security-disclosure policy not yet verified: we couldn't inspect the source repository.
- **Schema Quality & AI Usability**: 78/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4333 tokens (~270/item across 16 items; 10 tools + 6 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 70/100
  - Stability observed for 21 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - All 2 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.
  - An AI judge read all 11 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### How do I install the FormLM MCP server?

FormLM runs locally as an npm package, launched with npx -y @formlm/cli mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add me-formlm-cli -- npx -y @formlm/cli mcp
```

### Cursor

```json
{
  "mcpServers": {
    "me-formlm-cli": {
      "command": "npx",
      "args": [
        "-y",
        "@formlm/cli",
        "mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "me-formlm-cli": {
      "command": "npx",
      "args": [
        "-y",
        "@formlm/cli",
        "mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add me-formlm-cli -- npx -y @formlm/cli mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "me-formlm-cli": {
      "type": "local",
      "command": [
        "npx",
        "-y",
        "@formlm/cli",
        "mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add me-formlm-cli --command npx --arg -y --arg @formlm/cli --arg mcp
```

### Hermes

```yaml
mcp_servers:
  me-formlm-cli:
    command: "npx"
    args: ["-y", "@formlm/cli", "mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "me-formlm-cli": {
      "Transport": "stdio",
      "Command": "npx",
      "Arguments": [
        "-y",
        "@formlm/cli",
        "mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add me-formlm-cli -t stdio -c npx -a -y @formlm/cli mcp
```

### Other

```json
{
  "mcpServers": {
    "me-formlm-cli": {
      "command": "npx",
      "args": [
        "-y",
        "@formlm/cli",
        "mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-02 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 57 to 60. That category is still filling its 30-day observation window: 17 days of observed history at the previous scan, 18 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-31 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-30 (score 67, 0)

- [functional regression] Security disclosure: fail → unverified

### 2026-10-29 (score 67, −4)

- [security regression] Source repository: pass → fail

### 2026-10-26 (score 71, +1)

No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-24 (score 70, −4)

- [security regression] CVE-2023-54404 affects this package: high
- [security regression] Known CVEs: pass → fail

### 2026-10-22 (score 74, +4)

- [functional improvement] Stability: unverified → 0.23

## MCP tools (10)

### `auth_login` (~356 tokens)

Login to FormLM

Login to FormLM. Three methods, in order of preference:

1\. Access Token (recommended): ask the user to copy it from
   formlm.me → Workspace → Account Settings → Access Token → Copy, then pass it as `token`.

2\. Email verification code (no password needed, fully in-chat, works for ALL accounts):
   a. Call auth_email_code { email } — returns a captcha image (show it to the user)
   b. Ask the user to read the 4 digits from the image, then call auth_email_code { email, captcha }
   c. A 6-digit code is emailed to the user (valid 5 minutes) — ask them for it
   d. Call this tool with { email, code }

3\. email + password: only for accounts that HAVE set a password.
   Accounts registered via email verification code or Google have NO password.
   If password login fails with 401/403, do NOT retry — switch to method 1 or 2.

IMPORTANT: At the START of any FormLM session (before calling formlm_generate/formlm_exec),
call auth_status first. If not logged in, authenticate immediately. Do NOT wait for a 401 error.

Input parameters:

- `code` (string): Email verification code (6 digits, valid 5 min) — request it via auth_email_code first
- `email` (string): Account email (use with `code` for verification-code login, or with `password`)
- `password` (string): Account password (use together with email; verification-code/Google accounts have no password)
- `token` (string): Access token from formlm.me → Workspace → Account Settings → Access Token → Copy

Output parameters:

- `message` (string)
- `ok` (boolean)
- `user` (string)

### `auth_email_code` (~238 tokens)

Request email verification code

Request an email verification code for FormLM login (part of auth_login method 2 — no password needed).

Two-step usage:
1\. Call WITHOUT `captcha` → returns a captcha image. Show it to the user and ask them to read the 4 digits.
   (The image is a human-verification gate — you cannot solve it yourself; the user must read it.)
2\. Call WITH `captcha` (the 4 digits) → if correct, a 6-digit code is emailed to the user (valid 5 minutes).
   Then ask the user for that code and call auth_login with { email, code }.

Server rate limits (anti-abuse): 1 send per email per 60s, 10 sends per IP per minute.
On 429, tell the user to wait a minute. On 403, the digits were wrong — fetch a fresh image and try once more.

Input parameters:

- `captcha` (string): The 4 digits the user read from the captcha image (omit on first call to get the image)
- `email` (string, required): Account email (the verification code will be sent here)

Output parameters:

- `message` (string)
- `stage` (string)

### `auth_status` (~56 tokens)

Check login status

Check current login status.
Tokens expire after 7 days — if this returns "Token invalid (expired)", ask the user to copy a fresh
Access Token from formlm.me → Workspace → Account Settings and re-login via auth_login.

Output parameters:

- `loggedIn` (boolean)
- `message` (string)
- `url` (string)
- `user` (string)

### `formlm_usage` (~142 tokens)

Account usage & budget

Report the logged-in account budget: plan, app-slot usage, and AI credits — check BEFORE batch creating.
Free plan caps at 10 apps (in-use AND recycle-bin apps hold a slot; purging frees it): once full,
app create / formlm_generate fail with 403 "app-limit". AI credits are billed per completed generation
(capped at zero — generation never blocks). When slots are full, tell the user: purge the recycle bin
at formlm.me → Workspace or upgrade (formlm.me → #/vip).
Requires a server that reports usage fields; on an older server those lines come back "n/a".

Output parameters:

- `account` (string)
- `appsLeft` (number)
- `appsLimit` (number)
- `appsUnlimited` (boolean)
- `appsUsed` (number)
- `credits` (number)
- `message` (string)
- `ok` (boolean)
- `plan` (string)

### `formlm_generate` (~1299 tokens)

Generate execution plan

Generate an execution plan from natural language description (Phase 1 only — does NOT execute any module).
Server runs: Plan AI (assess-plan.md) → generates task list for 6 modules (form/scale/connect/report/expert/share).
Returns: appId, planType, name, plan JSON, and task list. Takes ~10-30 seconds.
This tool is plan-only — the name "generate" predates the split. There is no single call that produces a live app;
that is generate → execute×N (or the CLI `formlm-cli smart generate` wrapper).

\## Scene Templates (when user description is vague, present these and ask them to choose):
1\. assessment: 评估量表 — 多维度打分 + 分值区间解读报告 (MOST COMMON, for psych/workplace/health)
2\. consultation: 咨询评估 — 评估 + AI专家对话解读 (for mental health / coaching)
3\. survey: 问卷调查 — 仅收集数据，无打分 (for feedback / research)
4\. exam: 考试测验 — 标准答案 + 对错判分 (for education / training)
5\. report: 外部评测 — 对外部对象打分评价+报告 (for performance reviews / 360 feedback)
6\. learn: 学习卡片 — 知识点 + 自测题 (for micro-learning)

\## AFTER SUCCESS — execute modules sequentially via formlm_execute:
The plan is cached server-side (~10 min TTL) — just call formlm_execute with appId and module for each module.
No need to pass the plan JSON back — it is handled automatically.
IMPORTANT: module coverage depends on planType. Only `consultation` plans include the `expert` module;
assessment / exam / report / survey / learn plans do NOT. If the app must have an AI expert, create it
explicitly afterwards with formlm_exec: "assess expert config --app <id> --name ... --role ... --kbText ..."
(otherwise the published page promises an expert the app does not have — silent functional gap).
After the ~10 min cache expires, formlm_execute still works if you pass the plan JSON back via `plan`
(the full plan is returned in this tool's output) — re-running this tool would create a NEW app instead.

\## USER FEEDBACK (IMPORTANT for good UX):
After getting the plan, tell the user: "✅ 计划已生成！" and list the modules.
Before each formlm_execute call, tell the user whic…

Input parameters:

- `appName` (string): PIN the app display name (default: chosen by the Plan AI). Use for batch creation when the caller must know the exact name up front to map apps to pages/ledgers.
- `dimensions` (string): PIN the scoring dimensions (names and count) instead of letting the Plan AI invent them — separate with | or ; (e.g. "Natural Finish|Glam Intensity|Editorial|Color Confidence"). Use whenever an exter…
- `input` (string, required): Natural language description of the app. Be specific: mention topic, audience, number of questions, dimensions/subscales, scoring, visual style. Example: "A workplace stress assessment for office wor…
- `lang` (string): BCP-47 language code (e.g. "zh", "zh-hant", "zh-tw", "en", "ja"). Injects an [OUTPUT LANGUAGE] directive that anchors AI output language for the plan AND every module execute. This is the only langua…
- `planType` (string): Plan type. Choose based on user needs: "assessment" (scoring+report, for psych/workplace/health evaluations, MOST COMMON), "consultation" (scoring+report+AI expert chat, for mental health/coaching),…
- `questionCount` (string): Target question count range: "5-9" (micro check-in, ~2 min), "10-15" (quick screening, 3-5 min), "15-20" (standard assessment, 5-8 min), "20-30" (deep assessment, 8-15 min), "30-50" (facet-level), "5…
- `style` (string): Visual style preference. Suggested options: "温暖亲切" (warm friendly, for health/care), "正式专业" (formal professional, for workplace/corporate), "简洁直接" (minimal clean, for general use), "轻松活泼" (lively pla…

Output parameters:

- `appId` (string)
- `appName` (string)
- `message` (string)
- `ok` (boolean)
- `planType` (string)
- `tasks` (array)

### `formlm_execute` (~354 tokens)

Execute plan module

Execute a single module from the plan generated by formlm_generate.
Call this sequentially for each module, following the task list order from formlm_generate.
Default order: form → scale → connect → report → expert → share.
Takes ~30-120 seconds per module. Do NOT cancel.

\## USER FEEDBACK (IMPORTANT for good UX):
Before calling, tell the user: "正在生成 [module] 模块..."
After calling, tell the user: "✅ [module] 模块完成"
After the last module (share), present the 3 URLs to the user.

\## PLAN PASSING:
Plan is cached server-side (~10 min) after formlm_generate — no need to pass it manually.
Just call formlm_execute with appId and module for each module in sequence.
If you get "Plan not found in server cache", pass the plan JSON from the formlm_generate output into `plan`
— do NOT re-run formlm_generate (that creates a brand-new app).
Success is structured: the response carries appId / module / taskStatus / status(success|error) — trust taskStatus,
not human wording. A retried `scale` execute appends dimensions unless existing ones are cleared first
(formlm_exec: "assess scale clear --app <id>").

Input parameters:

- `appId` (string, required): App ID from formlm_generate result
- `module` (string, required): Module to execute: form / scale / connect / report / expert / share
- `plan` (string): Full plan JSON (optional — the plan is cached server-side for ~10 min after formlm_generate; pass this only to resume after the cache expired)

Output parameters:

- `accessType` (string)
- `appId` (string)
- `builderUrl` (string)
- `dataUrl` (string)
- `message` (string)
- `module` (string)
- `ok` (boolean)
- `shareToken` (string)
- `shareUrl` (string)
- `taskStatus` (string)

### `formlm_snapshot` (~241 tokens)

App state snapshot

Get aggregated snapshot of ALL 6 app modules in a single call.
Returns: form fields, scale dimensions+ranges, connect page styles, report pages+widgets, expert config, share status.

Call this BEFORE making changes to understand what already exists.
Call this AFTER formlm_generate to verify the generated app.

Prefer summary=true for batch audits / consistency checks: it returns a compact profile
(appName, fieldCount, questionCount, dimCount+dimNames, reportPageCount+reportPages,
styled, expertEnabled/expertHasContent, share.type/perm/day/forever/shareToken) instead of
the full module payloads, so you do not have to parse widget layoutData or markdown tables.
If any module fetch fails the result carries _errors/_degraded — treat it as UNKNOWN, not as "empty module".

Input parameters:

- `appId` (string, required): App ID
- `module` (string): Get only one module: form / scale / connect / report / expert / share (default: all 6)
- `summary` (boolean): Return the compact audit profile instead of full module payloads (recommended for batch verification)

Output parameters:

- `data`
- `mode` (string)

### `formlm_doctor` (~313 tokens)

Quality audit (read-only)

Read-only quality inspection of ONE app — the fastest way to verify a generated app before wiring it into a page.
Returns {ok, failCount, warnCount, summary, findings[]} where each finding is {name, level(pass|warn|fail), detail, fix?}.

Checks: content/scoring coverage, expert enabled-but-empty or referenced-but-missing (dead AI assistant),
styling applied, dimensions without report pages, unexpected certificate page, share access semantics
(type=all/owner = login required — anonymous respondents get the login page, NOT the form), link expiry,
and fill-in URL reachability.
Set expectLang (e.g. "en", "zh-hant") to catch text written in the wrong script — the classic batch defect
where an English app ends up with Chinese certificate/report boilerplate. Use deep=true to also scan report
widget BODY text (extra queries; titles/labels are always scanned).

Read-only: this tool never writes. Apply the returned `fix` commands via formlm_exec.

Input parameters:

- `appId` (string, required): App ID
- `deep` (boolean): Also fetch and scan report widget body text (slower, more accurate language check)
- `expectLang` (string): BCP-47 expected language, e.g. "en" / "zh" / "zh-hant" / "ja". Enables the script-consistency scan.
- `probe` (boolean): Probe the fill-in URL for reachability (default true)

Output parameters:

- `appId` (string)
- `failCount` (number)
- `findings` (array)
- `message` (string)
- `ok` (boolean)
- `summary`
- `warnCount` (number)

### `formlm_skill` (~99 tokens)

Domain knowledge doc

Get the full SKILL.md domain knowledge for a specific skill module.
Same documents that AssessAgent loads internally — contains P0/P1/P2 constraints, parameter rules, examples.

You can also read these via MCP resources: formlm://skills/<skillId>
READ the relevant skill BEFORE constructing formlm_exec commands manually.

Input parameters:

- `skillId` (string, required): Skill ID: form / scale / connect / report / expert / share

Output parameters:

- `markdown` (string)
- `skillId` (string)

### `formlm_exec` (~888 tokens)

Run FormLM CLI command

Execute a raw FormLM CLI command directly.
Use this for fine-grained control that formlm_generate doesn't cover, or for modifying existing apps.

IMPORTANT: All commands must start with "assess". Read formlm_skill first to ensure P0 compliance.

SAFETY — destructive operations (remove/delete):
  Before running ANY "remove" command (app/form/scale/expert), first run the matching
  "query"/"list"/"find" command to show the user the EXACT name of what will be deleted,
  then get explicit confirmation ("Delete app 'X' (id: Y)? This cannot be undone.").
  NEVER call a remove command based on a vague reference ("delete it", "remove that one")
  without first resolving and confirming the exact target. Deletion is irreversible.

Whitelisted commands (3-token granularity; anything else returns 403):
  App:     assess app list/create/use/current/update/remove/urls
  Form:    assess form query/find/types/config/add/update/remove/move/set-property
  Scale:   assess scale query/find/add/update/set/remove/clear/config/keys/data
  Connect: assess connect query/find/types/config/cover-page/final-page/main-page/style
  Report:  assess report query/find/update/page/widget  (conditional rules: assess report widget logic add/list/remove)
  Expert:  assess expert query/find/config/set/avatar/remove/chat
  Share:   assess share set/query/url/api/flavor
  Smart:   assess smart plan/execute
  Skill:   assess skill form/scale/connect/report/expert/share
  NOT available here: assess snapshot / assess field * (CLI-only wrappers of the module queries)

Common patterns:
  "assess app list --all --with-urls --json"                                                     (full inventory incl. shareToken per app)
  "assess app urls --app <id> --json"                                                            (URLs + published/shareType/shareToken)
  "assess form add --app <id> --id q1 --name \"Name\" --type radio --options \"A:1,B:2,C:3\" --json"
  "assess scale add --app <id> --id stress --name \"St…

Input parameters:

- `command` (string, required): Full CLI command starting with "assess". Do NOT include the "formlm-cli" prefix. Add --json flag for structured output. Escape inner quotes with \".

Output parameters:

- `code` (number)
- `data`
- `message` (string)
- `ok` (boolean)

## Diagnostics

Captured diagnostic sections: Provenance, Vulnerabilities, Dependencies. The full working is on the page: https://verifymcp.io/servers/me-formlm-cli/formlm-cli#diagnostics

## Score history

- 2026-11-05: 70
- 2026-11-04: 70
- 2026-11-03: 69
- 2026-11-02: 69
- 2026-11-01: 68
- 2026-10-31: 68
- 2026-10-30: 67
- 2026-10-29: 67
- 2026-10-28: 71
- 2026-10-27: 71
- 2026-10-26: 71
- 2026-10-25: 70
- 2026-10-24: 70
- 2026-10-23: 74
- 2026-10-22: 74
- 2026-10-21: 70
- 2026-10-20: 70
- 2026-10-19: 70
- 2026-10-18: 70
- 2026-10-17: 70
- 2026-10-16: 70
- 2026-10-15: 70
- 2026-10-14: 38
- 2026-10-13: 38
- 2026-10-12: 38
- 2026-10-11: 38

## Common questions

### What is the FormLM MCP server?

FormLM is an MCP server listed in the public MCP registry as me.formlm/cli. Build AI-powered forms, scored assessments and professional reports on FormLM, by natural language. This page covers its npm package (@formlm/cli).

### Is the FormLM MCP server safe to use?

FormLM scores 70 out of 100 on VerifyMCP. We recorded 1 known advisory against it as of 5 November 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the FormLM MCP server expose?

FormLM exposes 10 tools: auth_login, auth_email_code, auth_status, formlm_usage, formlm_generate, and 5 more. Their descriptions and schemas cost roughly 3,986 tokens of context every time the server is loaded.

### Is the FormLM MCP server still maintained?

FormLM is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the FormLM MCP server under?

FormLM declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the FormLM MCP server?

VerifyMCP ran 15 checks on FormLM, covering Malware scan, Known CVEs, Install scripts, Dependency health and 11 more. One item could not be completed, a gap on our side rather than a finding about FormLM: Security disclosure. Endpoint Security and Transport & Reachability do not apply to an npm package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- npm package: https://www.npmjs.com/package/@formlm/cli
- Socket report: https://socket.dev/npm/package/@formlm/cli
- Website: https://formlm.me/
- Changelog RSS feed: https://verifymcp.io/servers/me-formlm-cli/formlm-cli.xml
- Changelog JSON feed: https://verifymcp.io/servers/me-formlm-cli/formlm-cli/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/me-formlm-cli/formlm-cli.json
- HTML version of this page: https://verifymcp.io/servers/me-formlm-cli/formlm-cli
