ClarifyPrompt MCP
     
A context-aware MCP prompt compiler that transforms vague prompts into platform-optimized prompts for 60+ AI platforms across 7 categories β grounded in your workspace signals (CLAUDE.md, AGENTS.md, .cursorrules, package.json), resolved intent, and the capabilities of the target model.
Send a raw prompt. ClarifyPrompt gathers the right context, resolves what you're actually trying to do, and returns a version specifically optimized for Midjourney, DALL-E, Sora, Runway, Higgsfield, ElevenLabs, Claude, ChatGPT, Cursor, or any of the 60+ supported platforms β with the right syntax, parameters, structure, and grounding.
New in 1.12.1: The real fix for #3 β thinking-channel models (gpt-oss, glm, β¦) now reliably produce optimized prompts instead of occasionally returning empty content. Root cause (re-investigated from scratch): they spend their token budget on the thinking channel first and never reach the final answer. The fix is a
max_tokensfloor for reasoning models (universal) plusreasoning_effort: "low"(for families that honor it, like gpt-oss; tune withLLM_REASONING_EFFORT) β not the previously-assumed/api/chatswitch, which turned out to be a dead end. Verified ongpt-oss:20b-cloudandglm-5.2:cloud(both 0% empty). See CHANGELOG.md. New in 1.12.0: Roadmap step #7 β ClarifyPrompt now speaks A2A (Agent-to-Agent). SetCLARIFYPROMPT_TRANSPORT=a2aand it serves as a discoverable A2A peer: an agent card at/.well-known/agent-card.json, acompile-prompt-for-platformskill over JSON-RPC (message/send) with live SSE streaming (message/stream), and first-class task cancellation +input-requiredclarification round-trips β all powered by the same compose pipeline. Other agents can now call ClarifyPrompt to compile prompts. stdio stays the default; nothing about existing setups changes.
How It Works
ClarifyPrompt does two things a plain prompt template can't. Every output below is a real, unedited capture from optimize_prompt run against this repo (see Provenance at the end of this section).
1 β It knows each platform. Same raw prompt, different target, completely different output:
You write: "a dragon flying over a castle at sunset"
β Midjourney A colossal, majestic dragon with shimmering scales soaring over a towering
medieval stone castle, dramatic sunset sky with vibrant orange and deep purple
hues, cinematic fantasy concept art, volumetric lighting, highly detailed
--ar 16:9 --v 6.1 --s 250 --q 2
β DALL-E A majestic dragon with glowing crimson scales soars over a towering medieval
stone castle, silhouetted against a vibrant orange and purple sunset sky.
Rendered in a high-fantasy digital art style with dramatic, warm lighting and
highly detailed textures, wide aspect ratio.
Midjourney gets --ar/--v/--s/--q flags; DALL-E gets flag-free natural-language prose. Same intent, each platform's native dialect.
2 β It knows what you're working on. This is the part a template can't fake. Drop a vague one-liner while editing src/transport.ts in this very repo, and the engine grounds it in your real workspace β package.json, git state, the active file β and resolves intent before it shapes the output:
You write: "add a configurable request timeout to the http transport"
Β· active file: src/transport.ts Β· resolved intent: production-code
Β· grounded in: active-file Β· workspace-meta Β· git-state Β· environment Β·
target-model Β· platform-hints
β Cursor Implement a configurable request timeout for the HTTP transport in
`src/transport.ts`.
Requirements:
1. Add a new environment variable `CLARIFYPROMPT_HTTP_TIMEOUT` β¦ (default 30000 ms)
2. Apply this timeout to all incoming requests in the streamable-http transport
β¦
5. Preserve existing behavior for stdio and a2a transports
β¦
The implementation should be added to the streamable-http section of
`startTransport()`.
(excerpted β the full rewrite has 7 numbered requirement groups)
Nothing in that one-line prompt mentioned the CLARIFYPROMPT_HTTP_ naming convention, the startTransport() entry point, or the stdio/a2a transports it must preserve β the engine read those from the active file and package.json and folded them in. That's the difference between rephrasing a prompt and compiling it against context*.
3 β It can run the whole pipeline. clarify β ground/optimize β critique β revise, in one compose_prompt call β see Previously in 1.4.0 β the composable pipeline below.
<a name="provenance"></a>Provenance. Image outputs captured via
glm-5.2:cloud, the grounded code output viaqwen3-coder:480b-cloudβ both Ollama cloud models served over Ollama's OpenAI-compatible endpoint (LLM_API_URL=http://localhost:11434/v1), run throughoptimize_promptagainst this repo on 2026-06-22. ClarifyPrompt is model-agnostic (any OpenAI-compatible API, local or hosted); outputs are model-dependent β yours will differ in wording, not in structure.
What's new in 1.12.1
The real fix for issue #3: thinking-channel models now reliably produce optimized prompts instead of intermittently returning empty content. Both gpt-oss:20b-cloud and glm-5.2:cloud went from empty ~40% of runs to 0%.
Re-investigating from scratch overturned the documented root cause. It was never "Ollama's /v1 shim drops the harmony final channel." These models spend their max_tokens budget on the thinking channel first and never reach the final channel β so content comes back "" (worse at higher reasoning effort). Two levers, applied together because different families honor different ones:
- A
max_tokensfloor (8192) for detected reasoning models β the universal lever. It attacks the root cause directly, so it works regardless of which thinking knob a family respects. It's a ceiling, not a target: short answers finish early, so no added latency. reasoning_effort: "low"β for families that respect it (gpt-oss), also trimming latency/cost. Tune withLLM_REASONING_EFFORT(low|medium|high).
The levers are genuinely family-specific: gpt-oss honors reasoning_effort but ignores Ollama's think; glm is the exact opposite β it ignores reasoning_effort, so only the budget floor saves it.
Detection is robust, not a hardcoded model list (which would rot as new models ship). "Is this a thinking model?" is answered, cached per model, by: (1) the runtime itself β Ollama's /api/show reports a thinking capability (this is how minimax-m3:cloud is detected, with no name match); (2) response-learning β any reasoning trace, or empty-content-with-tokens, marks that model thereafter (works for any provider); (3) a small name hint as last resort. Non-reasoning models stay byte-identical, and the name-agnostic empty-content retry is the final backstop. Validated on gpt-oss:20b-cloud, glm-5.2:cloud, and minimax-m3:cloud (all 0% empty on the first call).
The previously-proposed "switch to Ollama's native
/api/chat" was a dead end β/api/chatwiththink:falsestill returns empty content for gpt-oss (it ignores it), and it would have added a fragile second code path.
What's new in 1.12.0
Step #7 β the final step β of the MCP modernization roadmap: ClarifyPrompt now speaks A2A (Agent-to-Agent), so other agents can call it to compile prompts. stdio stays the default; nothing about existing setups changes.
Set CLARIFYPROMPT_TRANSPORT=a2a and ClarifyPrompt comes up as a discoverable A2A peer on Node's built-in http (the only new dependency is the official @a2a-js/sdk, which itself pulls just uuid):
| Endpoint | Purpose | |---|---| | GET /.well-known/agent-card.json | Agent card β discovery: identity, capabilities, the compile-prompt-for-platform skill | | POST /a2a | A2A JSON-RPC 2.0: message/send, message/stream (SSE), tasks/get, tasks/cancel, β¦ | | GET /health | Liveness probe |
CLARIFYPROMPT_TRANSPORT=a2a CLARIFYPROMPT_HTTP_PORT=3000 npx clarifyprompt-mcp
# β card: http://127.0.0.1:3000/.well-known/agent-card.json
# β a2a: POST http://127.0.0.1:3000/a2a (message/send Β· message/stream)
The whole roadmap pays off here β one incoming A2A message flows through the same compose pipeline, and the primitives built in earlier steps map straight onto A2A semantics:
- Compile β a
message/sendwith the raw prompt (plain text, or JSON{ prompt, platform?, category?, β¦ }) returns a task whose artifact carries the optimized prompt (text) plus the full structured compose result (data). - Streaming (1.10.0 progress β A2A) β
message/streamemitsstatus-updateevents as each pipeline stage runs, then the artifact, over SSE. - Cancellation (1.10.0 AbortSignal β A2A) β
tasks/cancelaborts the in-flight compose within milliseconds and reports a terminalcanceledstate. - Clarification (1.9.0 elicitation β A2A) β clarify is off by default for one-shot peers; opt in with
pre_clarify: 'auto' | 'always'and an ambiguous prompt pauses the task in A2A's first-classinput-requiredstate with the questions (readable text + structured data). Answer on the same task and it compiles.
Configure the public base URL advertised in the card with CLARIFYPROMPT_A2A_BASE_URL (handy behind a proxy); port/host are shared with streamable-http. New deterministic npm run test:a2a battery drives card discovery, a live compile, the clarify round-trip, and SSE streaming.
What's new in 1.11.0
Step #6 of the MCP modernization roadmap: a pluggable transport factory β ClarifyPrompt can now serve over Streamable HTTP, the runway toward A2A and remote MCP hosts. stdio stays the default; nothing about existing setups changes.
Transports
Set CLARIFYPROMPT_TRANSPORT:
| Value | Behaviour | |---|---| | stdio (default) | One server over stdin/stdout β exactly as before | | streamable-http | MCP Streamable HTTP over Node's built-in http (no new deps): stateful sessions (mcp-session-id), SSE streaming, a /health probe | | a2a | Serve as an A2A (Agent-to-Agent) peer β agent card, JSON-RPC + SSE (see 1.12.0 above) |
HTTP knobs (in streamable-http / a2a mode): CLARIFYPROMPT_HTTP_PORT (3000), CLARIFYPROMPT_HTTP_HOST (127.0.0.1 β localhost-only by default), CLARIFYPROMPT_HTTP_PATH (/mcp, streamable-http only).
CLARIFYPROMPT_TRANSPORT=streamable-http CLARIFYPROMPT_HTTP_PORT=3000 npx clarifyprompt-mcp
# β POST http://127.0.0.1:3000/mcp Β· GET http://127.0.0.1:3000/health
Tool/resource registration moved into an exported createServer() factory: stdio gets one server, streamable-http gets one per session (the SDK-recommended, GHSA-safe pattern β never shares a server across HTTP clients). New deterministic npm run test:http battery drives a full HTTP session.
What's new in 1.10.0
Step #5 of the MCP modernization roadmap, stable core: compose_prompt is cancellable and reports live progress. Model-agnostic, opt-in, fully back-compat.
Cancellation
An AbortSignal is plumbed through the entire LLM path (simpleGenerate β chat β fetch, combined with the per-call timeout) and every engine stage. When a client sends notifications/cancelled for a compose_prompt call, the in-flight model request aborts immediately and the revise loop stops at the next stage boundary β instead of running every iteration to completion. The signal reaches fetch regardless of which model/provider is configured.
Progress
Include a progressToken in the compose_prompt request _meta and the server emits notifications/progress at each stage (clarify / optimize / ground / critique) with a monotonic counter and a human message like optimizing prompt [iter 2/3]. Hosts can show a live status on a long multi-iteration compose. No token β no notifications, zero overhead.
Why not MCP tasks (yet)
Roadmap #5 named the MCP tasks API. It's still experimental/ in the SDK ("may change without notice"), its reference is ~600 lines, and no current client speaks the tasks/* protocol β so a full implementation would be unusable off-by-default code today. The real value (cancellable + progress-reporting compose) is delivered here on stable primitives; the experimental async-task wrapper is deferred to land with #7 (A2A), which the AbortSignal groundwork here already sets up. New deterministic npm run test:cancel battery locks the behavior.
What's new in 1.9.0
Step #4 of the MCP modernization roadmap: clarify_with_user can elicit answers through the host's native form UI. Opt-in, fully back-compat.
Interactive clarification
Pass elicit: true. On a client that supports MCP elicitation, the clarifying questions become a real form:
- each question is a field,
optionsbecome enum dropdowns, and eachsuggestedAnsweris the field default (one-click accept); - the user answers inline; the engine returns
answers: [{ question, dimension, answer, usedSuggested }]withelicited: true.
Without elicit, on a non-capable client, or if the round-trip errors, the tool returns the same raw-questions JSON it always has β every existing caller is unaffected. decline / cancel are surfaced via elicitationAction.
This turns clarification from "here's a JSON blob of questions, you render it" into a first-class interactive moment in hosts like Claude Desktop. The mapping lives in a small pure module (src/engine/clarification/elicit.ts), reusable by compose_prompt's pre-clarify stage later. New deterministic npm run test:elicit battery (pure helpers + a live mock-client round-trip) locks it.
What's new in 1.8.0
Step #3 of the MCP modernization roadmap: the engine's read surfaces become browseable resource templates with argument autocompletion. No tool or engine behavior changes.
Resource templates
Four templates join the static clarifyprompt://categories, each backed by an existing engine getter:
| URI template | What it reads | |---|---| | clarifyprompt://platforms/{category}/{id} | One platform's full config β resources/list enumerates all 60+ as individual URIs | | clarifyprompt://traces/{date} | Optimization-trace summary index for a UTC day | | clarifyprompt://packs/{id} | One loaded knowledge pack's metadata | | clarifyprompt://memory/facts/{scope} | Live remembered facts under a scope |
MCP hosts with a resource browser (Claude Desktop, Cursor) now get a navigable tree instead of a single static blob.
Autocomplete
completion/complete resolves the template variables: {category} β the 7 category ids, {id} β platform ids scoped by the chosen {category}, {date} β days with traces, pack ids, memory scopes. (MCP completion applies to prompt args + resource-template variables only β not tool inputs; ClarifyPrompt registers no prompts, so it lives on the templates.)
Capabilities
The server now advertises resources (with templates) and completions at initialize. New deterministic npm run test:resources battery locks the surface.
What's new in 1.7.1
Patch fixing #3: a silent empty optimized prompt from models whose answer didn't land in content.
- Reads all three thinking-channel field names (
reasoning/thinking/reasoning_content) β fixes DeepSeek / qwen-thinking and similar. - Retries once, then fails loudly when content is empty regardless of any thinking field. This covers the real issue #3 case: gpt-oss harmony output over Ollama's
/v1shim generates tokens (completion_tokens > 0) but returnscontent: ""with no thinking field. The engine now degrades to the original prompt + a surfacederrorinstead of returning blank. - Genuinely recovering gpt-oss harmony output (via Ollama's native
/api/chat) is a tracked follow-up β out of scope for a patch. The silent-failure harm is resolved now. - New deterministic
npm run test:thinkingbattery locks the regression with mocked responses (no live cloud dependency).
Verified: test:thinking, reasoning battery (gpt-oss degrades loudly; the genuine reasoner kimi-k2-thinking:cloud still returns real content), integration, day2, evals, wire.
What's new in 1.7.0
Step #2 of the MCP modernization roadmap: the entire tool surface migrated off the deprecated server.tool() shorthand (removed in SDK 2.0) onto server.registerTool(). No engine behavior changes; full back-compat.
What hosts get
- Titles β every tool has a human-readable display name ("Forget a fact", not
memory_forget). - Behavior annotations β all 23 tools declare
readOnlyHint/destructiveHint/idempotentHint/openWorldHint. The three destructive tools (memory_forget,unload_pack,unregister_platform) are flagged for confirmation UIs; the seven read-only inspectors are flagged safe-to-call-freely; the seven tools that reach the network (LLM / embeddings / web search) carryopenWorldHint: true. - Structured output β every tool declares an
outputSchemaand returnsstructuredContentalongside the JSON text. Schemas are permissive by design (all-optional, passthrough) β they document the shape without ever rejecting engine output.
Back-compat
Text content is byte-identical for every tool β including the three array-returning list_* tools, whose text stays a bare array while structuredContent wraps it in an object per the MCP spec. Error returns unchanged. Verified: wire 7/7, integration 9/9, day2, 26/27 evals with zero output-validation errors.
Found during verification
#3 β cloud gpt-oss thinking-channel responses can yield an empty optimizedPrompt (remote API change exposing a pre-existing field-name gap in client.ts; fix targeted for 1.7.1).
What's new in 1.6.8
Housekeeping release closing the loops the 1.6.5β1.6.7 cascade opened. No engine code, MCP tool surface, platform, or env-var changes.
Changed
- CI matrix now tests Node 24 (current active LTS, EOL Apr 2028) alongside 18/20/22 across Ubuntu + macOS. The matrix previously tested two EOL Node versions but not the current LTS at all. Verified before merge that the native deps (
better-sqlite3+sqlite-vec) load and function on Node 24.16.0 in a toolchain-freenode:24-slimcontainer.enginesstays>=18β maximum compatibility, and we test what we claim. - Publish runner moved Node 20 β 22, keeping an EOL runtime off the release-critical path (matches the Dockerfile base).
Process
- New ship-check
CP-13 β lockfile regeneration safetyencodes the lesson from the 1.6.5β1.6.6β1.6.7 cascade: a singlenpm install --package-lock-onlysilently dropped 4 of 5sqlite-vecplatform binaries (broke Linux CI) and pulled a within-caretbetter-sqlite3bump that dropped Node 20 prebuilds (broke the Docker build). The check mandates fullnpm installon dep changes, a lockfile diff for dropped platform deps + native-dep version jumps, and a local slim-Docker load gate. Dogfooded on this release.
What's new in 1.6.7
Dockerfile patch. No engine code, MCP tool surface, platform, or env-var changes.
Fixed
CI / docker buildfailed on 1.6.6 withnpm error gyp ERR! find Python. Root cause:better-sqlite3@12.10.0(released 2026-05) explicitly removed prebuilt binaries for Node.js v20 and v23 because Node 20 reached EOL in April 2026. The 1.6.6 lockfile regen pulled 12.10.0 within the^12.9.0caret, andnode:20-slimdoesn't have Python + a C++ toolchain to compile from source. Bumped the Dockerfile base tonode:22-slimβ current active LTS, still has working prebuilts.- The non-Docker CI build matrix (Node 18 / 20 / 22 across macOS + Ubuntu) still passes because regular runners can compile-from-source as fallback. Only the slim Docker image stumbles.
Verified locally
docker build β green. Container can require('better-sqlite3') + require('sqlite-vec') cleanly. All 5 sqlite-vec platform binaries still in package-lock.json (1.6.6's fix held).
What's new in 1.6.6
Lockfile + harness patch following 1.6.5. No engine code, MCP tool surface, platform, or env-var changes. Ships the MCP-completeness audit doc.
Fixed
package-lock.jsonlost 4 of 5sqlite-vecplatform binaries during the 1.6.5 SDK bump. My localnpm install --package-lock-onlyretained only the maintainer'ssqlite-vec-darwin-arm64binary.npm cion CI's Ubuntu runners failed withno such module: vec0becausesqlite-vec-linux-x64wasn't in the lock. End-usernpm install clarifyprompt-mcp@1.6.5was never affected (the npm tarball doesn't ship a lockfile; users resolve platforms at install time). Regenerated with fullnpm installso all 5 platforms (darwin-arm64,darwin-x64,linux-arm64,linux-x64,windows-x64) are back.- Eval harness HTML report writer crashed on ERRORED entries (
evals/run.mjs:729). The pre-existing renderer assumed every non-skipped, non-filtered run had anevaluation.checksfield, but errored runs carry anerrorfield instead. Added an explicit errored-status branch β the harness now degrades gracefully and exits cleanly even when fixtures error.
Bundled docs
docs/audits/mcp-completeness-2026-05.mdβ diagnostic audit of the engine's MCP surface against the current SDK + spec. Tool-by-tool registration table, resource gap analysis, SDK feature delta (1.12 β 1.29 β 2.0-alpha), capability declarations, transport refactor sketch, A2A feasibility note, and a sequenced 7-step modernization roadmap. The artifact behind next-session planning. No engine changes prescribed inline.
Numbers
- 5 sqlite-vec platforms in lockfile (was 1).
npm audit --production: 0 vulnerabilities (unchanged). Tools: 23 (unchanged). Eval fixtures: 30 (unchanged).
What's new in 1.6.5
Security patch. No engine code changes, no MCP tool surface changes, no platform changes, no env-var changes.
Fixed
- CVE-2026-0621 β ReDoS in
@modelcontextprotocol/sdk'sUriTemplateregex (patched in SDK1.25.2). The previous^1.12.1floor allowed vulnerable resolutions on stale npm caches; bumped to^1.29.0so the floor itself is patched. - GHSA-345p-7cg4-v4c7 β Shared server/transport instances leak cross-client response data (patched in SDK
1.26.0). Not exploitable in practice for ClarifyPrompt (one host = one server instance) but the vulnerable code is now out of the dependency graph entirely. - 7 transitive vulnerabilities (2 moderate, 5 high) in the SDK's bundled HTTP-transport substack (
hono,express-rate-limit,fast-uri,ip-address,path-to-regexp,qs,@hono/node-server). Cleared vianpm audit fix. Never affected runtime β ClarifyPrompt is stdio-only and doesn't load the HTTP transport β but they were noise in users'npm auditreports and made the install look unsafe.
Numbers
npm audit --productionβ 0 vulnerabilities (was 2 SDK CVEs + 7 transitive).package-lock.json: net β336 lines (the old caret was pulling in heavy unused HTTP-transport ancillaries; the fix swapped them for slimmer alternates).- Tools: 23 (unchanged). Platforms: 60+ (unchanged). Eval fixtures: 30 (unchanged).
- Wire test + integration battery + day2 + reasoning + 29/30 evals pass against the new floor on local Ollama. The one eval fail (
analyzer-creative-media) is a pre-existing qwen-coder-7b classifier flake β verified SDK-independent by stash-reverting and re-running.
Why the floor bump matters
^1.12.1 was misleading documentation β caret resolution was actually pulling SDK 1.27.1 for any fresh npm install since early 2026. The floor bump aligns the declared baseline with what npm was already doing for most users while guaranteeing the floor for users on stale caches. It also positions us for the eventual 2.0.0-alpha migration when that line stabilizes (the modern SDK deprecates .tool() / .prompt() / .resource() shorthand registration in favor of registerTool() / registerPrompt() / registerResource() with title + outputSchema + annotations).
What's new in 1.6.4
Docs + process patch. No engine, MCP tool, or platform changes β but a meaningful cleanup of the pack-distribution model.
Pack registry consolidated back into the engine repo
LumabyteCo/clarifyprompt-packs (the separate community-pack registry created in 1.3 with the right principle but at the wrong scale) has been archived. Its three starter packs already lived in this repo's packs/ folder; the registry was meant to be the canonical home but in practice everything always shipped from here via the npm tarball. The drift caught up: higgsfield-creative-handbook shipped in 1.6.2 and never made it to the registry, even though the registry's own README told users to fetch packs from there.
Net result of 1.6.4:
- Single source of truth.
packs/.mdknowledge packs +packs/platforms/.yamlplatform configs all live inclarifyprompt-mcpand ship in the npm tarball. - New top-level Knowledge packs section in this README explains the loading model (
load_knowledge_pack({source: "<url-or-path>", scope: ...})), the three starter packs + Higgsfield, the scope semantics, and how to contribute. - New
packs/README.mdβ pack authoring guide (frontmatter schema, chunk boundaries, quality bar). Lifted from the archived registry so the content isn't lost. - Tombstone redirect on the archived repo. Anyone visiting
clarifyprompt-packslands on a banner pointing here.
When does the split come back?
When there's a forcing function: a community PR queue on packs alone, pack count >20, or divergent licensing/governance. Until then the maintenance cost of keeping two repos in sync wasn't paying for an audience that hadn't materialized.
Numbers
- Tools: 23 (unchanged).
- Platforms: 60+ (unchanged).
- Bundled knowledge packs: 4 (
anthropic-brand-voice,higgsfield-creative-handbook,nextjs-14-best-practices,sox-compliance) β same as 1.6.2/1.6.3, just newly canonical. - Eval fixtures: 30 (unchanged).
- Tarball size: unchanged from 1.6.3.
What's new in 1.6.3
Patch. The 1.6.2 CI tag-push run surfaced two real issues β fixed here without changing any engine code.
Fixed
evals/fixtures/28-context-includes-git-state.yamlpreviously assertedgit_branch_present: true, but GitHub Actions checks out in detached-HEAD mode wherebundle.git.branchis correctlyundefined(only the SHA + recent commits are populated). Relaxed to assertbundle_has_git: trueonly β that's what's actually invariant across local + CI environments.evals/fixtures/17-critique-strong-prompt-accepts.yamlassertedverdict: accept+overall_score_min: 7on a strong prompt. gpt-4o-mini's judge calibrates stricter than qwen2.5-coder:7b's, and occasionally returned a malformedoverallfield that the parser defaulted to 0 β verdict=reject. The fixture's real intent is to verify engine wiring (5+ dimensions, the standard dimension names present, no harness error) β not to compare judge calibration across models. Dropped the verdict + tight score assertions; kept the wiring-level checks.- README Glama badge swapped from inline
<img>(sometimes broken via GitHub's camo proxy) to a shields.io text-link badge that's stable across all rendering surfaces.
Notes
- No engine code changes. No new MCP tools (still 23). No platform changes (still 60+). No env-var changes.
- Eval baselines unchanged on local Ollama. This is a CI-specific hardening β local runs against qwen-coder-7b produced the same results before and after.
- The CI publish-gate failure that appeared on the v1.6.2 tag push was downstream of the eval failure (
Wait for evals workflowstep blocked publish). Now that the underlying fixtures don't false-fail on gpt-4o-mini + detached-HEAD CI, the publish gate clears too.
What's new in 1.6.2
Patch. Two additive ships, both no-code-changes from the engine's perspective:
Higgsfield creative-handbook knowledge pack
packs/higgsfield-creative-handbook.md β a community-style markdown pack documenting Higgsfield's actual conventions: model-selection rules (which of the 13 models for which use case), Soul ID character-training workflow, camera-move vocabulary, prompt-structure pattern (long-form prose, not keyword tags), multi-reference editing, Marketing Studio modes, common pitfalls (don't translate Midjourney flags verbatim), output specs.
Load it explicitly:
load_knowledge_pack source="https://raw.githubusercontent.com/LumabyteCo/clarifyprompt-mcp/main/packs/higgsfield-creative-handbook.md"
β¦or, since it ships in the npm tarball, point at the installed copy. The Context Curator grounds Higgsfield-targeted prompts in this pack's chunks automatically via semantic retrieval. See the Knowledge packs section for the full loading + scoping model.
npm run matrix β multi-model eval matrix runner
evals/matrix.mjs runs npm run eval sequentially against N models and stitches the results into one side-by-side HTML (evals/matrix.html by default). Lights up the model-class-gated fixtures (shape-small-local-model / shape-mid-tier-model / shape-reasoning-model) that single-model runs skip, and exposes deltas like "qwen-7b fails analyzer-creative-media but gpt-4o-mini passes it" in a glance.
npm run matrix -- --models qwen2.5-coder:7b-instruct-q4_K_M,gpt-oss:20b-cloud,glm-5.2:cloud
Outputs a dark-themed table β rows = fixtures, columns = models, cells = pass / fail / skip / errored with tooltips showing which checks failed.
Companion fix: evals/run.mjs gains a --json-out <path> flag that writes structured per-model results (matrix.mjs uses it; CI agents can use it too).
Numbers
- No tool surface change. Still 23 MCP tools.
- No platform count change. 60+ platforms (
packs/platforms/*.yamlunchanged). - 30 β 30 fixtures (no new fixtures; matrix is tooling, not coverage).
- Tarball grows ~10 KB for the knowledge pack.
evals/matrix.mjsis NOT in the tarball β it's a maintainer/contributor tool, not a runtime artifact.
What's new in 1.6.1
Patch release. Adds Higgsfield as a target platform in both image and video categories. No code changes β pure YAML platform-pack additions and one eval fixture.
Higgsfield is a multi-model creative platform that exposes its own MCP server at https://mcp.higgsfield.ai/mcp. Inside one connection you get:
- Image: Soul 2.0, Soul Cinema, Soul Cast (character-consistent), Flux 2, Seedream 5, Nano Banana Pro, GPT Image 2
- Video: Cinema Studio, Sora 2, Veo 3.1, Kling 3.0, WAN 2.6, Seedance 2.0
- Workflows: Soul ID character training, Lipsync Studio, UGC Factory, Marketing Studio, virality_predictor
The 1.6.1 ClarifyPrompt platform entries surface Higgsfield's model identifiers and prompt-style conventions (long-form natural-language prose; composition + lighting + textures + mood; up to 4K images / 15 s video / Soul ID for character consistency) as syntax hints to the curator.
Recommended pattern: install both clarifyprompt-mcp AND Higgsfield's MCP in your client (Claude Desktop / Cursor / AI Butler / Claude Code). Use optimize_prompt(platform: 'higgsfield', ...) or compose_prompt(platform: 'higgsfield', ...) to compile, then pass the compiled prompt to Higgsfield's generate_image / generate_video tool. MCPs compose at the client; ClarifyPrompt stays at the "compile" layer.
29 β 30 eval fixtures. Same MCP tool surface as 1.6.0 (23 tools, 1 resource). No env-var changes.
What's new in 1.6.0
Four targeted additions across the engine's four pillars (memory / agentic / models / context), each shipped behind real eval fixtures. 3 new MCP tools (23 total). Fully back-compat with 1.5.x β no removed tools, no removed fields, no required env-var changes.
Memory β explicit fact CRUD (memory_remember, memory_forget, memory_list_facts)
Before 1.6, facts only entered persistent memory via reflection on save_outcome β implicit, LLM-extracted, after-the-fact. 1.6 adds the explicit path:
memory_rememberβ directly insert a(subject, predicate, object)triple with explicit confidence. Source taggeduser:explicit. Auto-embedded for future semantic retrieval.memory_forgetβ soft-delete (bi-temporalinvalidated_at) a fact by id. Idempotent: re-forgetting an already-invalidated fact is a no-op and returnssuccess: falsecleanly.memory_list_factsβ list live facts in a scope (defaultuser), optionally filtered by predicate. Sorted by most-recently-observed.
This closes the obvious UX gap where the engine could only learn from outcomes β now users can say "remember I prefer X" directly.
Agentic β compose_prompt's new max_iterations revise loop
compose_prompt used to revise once (the critique's improvedPrompt replaced the optimization, if the verdict wasn't accept). 1.6 adds a loop:
{ "prompt": "...", "post_critique": true, "auto_revise": true, "max_iterations": 3 }
Each iteration after the first re-runs optimize + critique on the previous iteration's improved prompt. Stops at verdict=accept, no improvedPrompt to feed back, or the cap. pre_clarify only runs once (no point re-asking on a rewrite). The response includes a new iterations field showing how many fired. Hard cap of 5 to prevent cost runaways.
Models β per-stage model routing
Each compose stage can now target a different model:
{
"prompt": "...",
"clarify_model": "qwen2.5-coder:7b-instruct-q4_K_M",
"optimize_model": "claude-sonnet-4-20250514",
"critique_model": "gpt-4o-mini"
}
Run clarify on a cheap local model, optimize on the big-budget frontier model, critique on the cheap judge. The override flows through every layer β optimization.metadata.model and critique.judgeModel in the response reflect the actual model that ran each stage.
Context β git-state + environment signals
Two new signal collectors feed the Context Curator:
bundle.gitβ current branch, short SHA, dirty flag, last 5 commit titles. Lets the engine ground prompts in "what you're iterating on" without you spelling it out. Detected viagit rev-parse/git status/git log; fails soft when cwd isn't a repo.bundle.environmentβnowIso/weekday/timezone(IANA fromIntl.DateTimeFormat). Helps with time-sensitive prompts ("send this email tomorrow"). Pure JS, never fails.
Both are low-utility candidates in the curator (won't dominate budget) but surface as grounding sources when relevant.
Eval coverage
23 β 29 fixtures (6 new):
- 24
memory-remember-persists/ 25memory-forget-invalidatesβ Me1 CRUD round-trip - 26
compose-loop-iteratesβ A1 loop infrastructure (newiterations_min/iterations_maxchecks) - 27
compose-per-stage-models-honoredβ M1 per-stage routing (newoptimization_model_eq/critique_model_eqchecks) - 28
context-includes-git-state/ 29context-includes-environment-timeβ C1 + C4 signals (newbundle_has_git/bundle_has_environment/git_branch_presentchecks)
Local baseline on qwen2.5-coder:7b: 25 passed / 1 failed / 3 skipped / 97% avg. The lone failure remains the persistent analyzer-creative-media model-class signal (untouched).
What's new in 1.5.2
The first release where CI's eval gate (against gpt-4o-mini) drove the diff. Three real fixes that the gate caught the moment we wired in the OPENAI_API_KEY secret:
- Memory store now supports any embedding dimension (#2). The persistent vec table was hardcoded to 768 dims (the nomic-embed-text default), so anyone configuring
EMBED_MODEL=text-embedding-3-small(1536),voyage-3(1024),embed-english-v3.0(1024), or any non-768 model would hitDimension mismatch: expected 768, got Non the firstmemory_searchcall. The store now derives the table name from the embedder's actual dimension and creates the dim-specific table at boot. Existing 768-dim installs are unaffected. LLM_TIMEOUT_MSenv-var override on the LLM client. Default stays at 30s; users on slow hosted models can bump it. The eval workflow uses 120s forgpt-4o-mini.- Eval harness hardened β no longer crashes when a tool throws an exception (the SDK returns plain-text error responses; the harness used to
JSON.parsethem and die). One bad fixture no longer tanks the whole run. - Live evals badge. The
evals.ymlworkflow runs on every push to main. The[![evals]](...)badge at the top of this README is its real-time status. Currently green at 20/0/3 Β· 100% ongpt-4o-mini.
No new MCP tools. No env-var surface changes (only an added optional LLM_TIMEOUT_MS). Fully back-compat with 1.5.x.
What's new in 1.5.1
A patch release on top of 1.5.0. Pure docs + ship-process improvements; runtime behavior is identical to 1.5.0.
- README marketing surfaces refreshed β the 1.5.0 release shipped with the README still on 1.4.0 in three places (headline blockquote, "What's new in X" heading, "cumulative through X" annotation). Every other version surface (
package.json,package-lock.json,server.json,src/index.ts,CHANGELOG) was correct, but the prose drifted because nothing automated touched it. 1.5.1 fixes that. - Two new ship-check audits β
CP-11(README marketing-surface coherence) hard-fails if any of the three above don't reference the currentpackage.json#version.CP-12(Platform-pack format validity) parses everypacks/platforms/*.yamland asserts schema validity. CP-11 was promoted to the user-scoped (cross-project) ship-check skill the same day, so future projects benefit too. - No code changes. No new MCP tools. No new env vars. Same tarball anatomy as 1.5.0 plus a few hundred bytes of CHANGELOG.
What's new in 1.5.0
Built-in platforms become declarative. The 58+ hardcoded TypeScript platform arrays move to packs/platforms/*.yaml β adding a built-in platform is now a YAML edit, not a TS edit. The TypeScript layer becomes a runtime loader with a hardcoded fallback table. Malformed YAML can never soft-brick the server.
packs/platforms/
chat.yaml 9 platforms
code.yaml 9
document.yaml 8
image.yaml 10
music.yaml 4
video.yaml 11
voice.yaml 7
README.md contributor docs
To add a new built-in platform: append an entry to the relevant category file, run npm run build, open a PR. No TS edit required. Custom-platform-via-runtime (register_platform) still works identically for user-installed platforms.
- Memory-layer eval coverage. The eval harness now supports
setup: [{tool, args}, ...]β a list of MCP tool calls executed BEFORE the maininput. Two new fixtures use it: one loads a knowledge pack inline and verifies the chunk surfaces ingrounding.sourcesafter the embed β store β retrieve β curate β ground pipeline; the other proves vector-search ranking quality. 23 fixtures total (was 20 in 1.4.0). - Test infrastructure modernization. The integration + Day-2 test batteries used to assert literal version strings (
1.3.0,16 tools) and broke on every bump. Now they readEXPECTED_VERSIONfrompackage.jsonand assert presence of a tool set rather than a tool count. Future bumps don't break the tests. - Adoption materials.
docs/adoption/ships with copy/paste-ready Show HN body, Reddit posts, Twitter thread, awesome-mcp-servers PR template, and catalog submission specs (mcp.so, Smithery, mcp-get, PulseMCP, modelcontextprotocol/servers). - One new runtime dep:
js-yamlpromoted from devDependency for the platform loader (~200 KB). - Same MCP tool surface as 1.4. 20 tools, 1 resource. No new tools; no removed tools; result shapes unchanged.
Previously in 1.4.0 β the composable pipeline
Four core operations as first-class MCP tools that compose. Use any tool standalone, or run the whole chain in one call:
βββββββββββββββ βββββββββββββββββββββββ ββββββββββββββββ
β clarify β β β ground OR optimize β β β critique β
β (optional) β β (core) β β (optional) β
βββββββββββββββ βββββββββββββββββββββββ ββββββββββββββββ
one call = compose_prompt(prompt, [sources], post_critique, auto_revise, ...)
clarify_with_userβ Given an ambiguous draft, returns 1β3 targeted clarifying questions, each with asuggested_answeryou can accept verbatim, optional 2β4 quick-pickoptions, and adimensiontag (audience/scope/format/length/tone/constraints/goal/platform). Short-circuits withclarificationNeeded: falseon confident, well-formed prompts so it pipelines cleanly in front ofoptimize_promptwithout a per-call latency tax.ground_promptβ The strict, retrieval-augmented variant ofoptimize_prompt. Caller-provided sources are pinned at the highest priority β above project rules, above pinned instructions β and tracked individually in the trace asuser-source:N. Strict mode: zero non-empty sources β error, no silent fall-through. Per-source body cap (4000 chars) so a single huge paste can't dominate the budget.critique_promptβ LLM-as-judge. Scores a candidate prompt 0β10 across 5 default dimensions (clarity, specificity, intent_alignment, format_fitness, length_appropriateness) β or your own criteria β with per-dimension rationale + concrete suggestions, an overall score, and a verdict (accept/revise/reject). Belowrevise_threshold(default 7.0) it also returns animprovedPromptyou can drop in. Use it pre-flight ("is this prompt good enough for the expensive model?"), postmortem ("was the prompt the cause?"), or to A/B-pick the best of N optimization variants.compose_promptβ One MCP call runs the canonical pipeline. Auto-decides the ground vs. optimize branch from whether you passedsources.pre_clarify: 'auto' | 'always' | 'never'.post_critique: trueadds a judge pass.auto_revise: truereplacesfinal_promptwith the rewrite when the verdict isn'taccept. Returns a per-stagestagesaudit array so the caller sees exactly what ran.- Eval harness v0 β Deterministic regression tests under
evals/. 20 YAML fixtures cover analyzer, shape, intent-overlay, grounding, clarify, critique, ground, and compose surfaces.npm run evalproduces a console summary + self-contained dark-themed HTML report. Multi-model matrix is just bash: runLLM_MODEL=... npm run eval -- --report-path evals/report-X.htmlper model. - CI-gated evals (opt-in) β When
OPENAI_API_KEYis set as a repo secret, the eval harness runs in CI againstgpt-4o-minias a release gate. Off by default; nothing leaves your machine without the secret. - 5 new MCP tools (20 total).
optimize_promptalso gains auserProvidedSourcesinjection point β bothground_promptandcompose_promptuse it under the hood, but it's available directly if you want explicit control without the strict-mode validation.
Carried over from 1.3: persistent memory + knowledge packs + reflective learning. The curator continues to score and fit grounding sources into the target model's remaining window.
explain_last_curationstill gives you a per-call breakdown of selected vs. rejected candidates with reasons.
What's in the box (cumulative through 1.12.1)
- Context Engine β auto-gathers workspace rules (
CLAUDE.md,AGENTS.md,.cursorrules,.clinerules,clarify.md), detects frameworks and languages frompackage.jsonand sibling manifests, tracks an active file excerpt, and maintains a per-session ring buffer of recent optimizations and their outcomes. - Unified
PromptAnalyzerβ one LLM call produces{ category, intent, recommendedMode, confidence }together. 10 intents:production-code,brand-voice,stakeholder-comm,data-extract,creative-media,technical-spec,analysis,quick-draft,exploration,unknown. Intent beats surface keywords on ambiguity. - Target-model-aware prompt shaping β system prompt,
maxTokens, andtemperatureadapt to the downstream LLM's context window and the resolved intent. Small local models get a compact prompt; Claude/GPT-4/Gemini get the full richness. - Grounding Context (single, priority-ordered) β user pinned instructions β project rules β active file β prior accepted examples β web search β workspace metadata β target-model hints β custom platform instructions β built-in syntax hints. No more parallel context silos.
- Session retrieval (save_outcome) β the caller reports
accepted | edited | rejectedper optimization; similar accepted outputs in the same session get injected as few-shot examples into future similar prompts. Persistent memory lands in 1.3. - Local JSONL tracing β every optimization writes a structured trace line (now with
shape,groundingSources,errorfields) to$CLARIFYPROMPT_HOME/traces/YYYY-MM-DD.jsonl. Nothing is uploaded. Toggle viaCLARIFYPROMPT_TRACE=off. - Unified
$CLARIFYPROMPT_HOMEβ one env var for everything ClarifyPrompt writes. LegacyCLARIFYPROMPT_CONFIG_DIR/CLARIFYPROMPT_DATA_DIRstill work (deprecation hint, silenceable). - Three transports β
stdio(default),streamable-http(MCP over Nodehttp, stateful sessions +/health), anda2a(an Agent-to-Agent peer: agent card, JSON-RPCmessage/send+ SSEmessage/stream, task cancellation,input-requiredclarification). OneCLARIFYPROMPT_TRANSPORTenv var; stdio behavior is byte-identical to before. - 60+ platforms, 7 categories, custom platforms β the original core is unchanged and fully backward-compatible.
- Any LLM, any provider. One code path works with any OpenAI-compatible API β Ollama (local + cloud), LM Studio, vLLM, OpenAI, Google Gemini, xAI Grok, Groq, Mistral, DeepSeek, Cohere, Perplexity, Together, Fireworks, OpenRouter β plus Anthropic Claude directly. Reasoning models (
o1/o3/o4,deepseek-reasoner,gpt-oss,*-thinking) are auto-detected and given a larger token budget so they actually produce content. See 15+ pre-configured provider examples below. - Apache-2.0, forever. Open-source core, no relicensing.
Quick Start
With Docker
Pull the published image from GitHub Container Registry (multi-arch: amd64 + arm64, with signed provenance + SBOM):
docker pull ghcr.io/lumabyteco/clarifyprompt-mcp:latest
All config is passed at run time β nothing is baked into the image, so the image is safe to share and contains no secrets:
# stdio (for MCP hosts that launch the container)
docker run --rm -i \
-e LLM_API_URL=http://host.docker.internal:11434/v1 \
-e LLM_MODEL=qwen2.5:7b \
-e CLARIFYPROMPT_HOME=/data \
-v clarifyprompt-data:/data \
ghcr.io/lumabyteco/clarifyprompt-mcp:latest
# or serve over HTTP / A2A
docker run --rm -p 3000:3000 \
-e CLARIFYPROMPT_TRANSPORT=a2a -e CLARIFYPROMPT_HTTP_HOST=0.0.0.0 \
-e LLM_API_URL=http://host.docker.internal:11434/v1 -e LLM_MODEL=qwen2.5:7b \
ghcr.io/lumabyteco/clarifyprompt-mcp:latest
Mount a volume at
CLARIFYPROMPT_HOMEto persist memory, traces, and packs across runs. PassLLM_API_KEY/EMBED_API_KEYas-eenv vars (or--env-file) at run time β never bake them into an image.
With Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"clarifyprompt": {
"command": "npx",
"args": ["-y", "clarifyprompt-mcp"],
"env": {
"LLM_API_URL": "http://localhost:11434/v1",
"LLM_MODEL": "qwen2.5:7b"
}
}
}
}
With Claude Code
claude mcp add clarifyprompt -- npx -y clarifyprompt-mcp
Set the environment variables in your shell before launching:
export LLM_API_URL=http://localhost:11434/v1
export LLM_MODEL=qwen2.5:7b
With Cursor
Add to your .cursor/mcp.json:
{
"mcpServers": {
"clarifyprompt": {
"command": "npx",
"args": ["-y", "clarifyprompt-mcp"],
"env": {
"LLM_API_URL": "http://localhost:11434/v1",
"LLM_MODEL": "qwen2.5:7b"
}
}
}
}
With AI Butler
AI Butler is a self-hosted personal AI agent runtime β single Go binary, multi-channel chat, MCP ecosystem hub. Drop ClarifyPrompt into its mcp.servers config and the agent picks up all 23 tools as native capabilities, callable from any channel (web chat, terminal, Telegram, Slack, etc.). AI Butler discovers tools dynamically via MCP's tools/list, so adding / removing tools in ClarifyPrompt updates the agent's surface automatically β no config edits needed on the butler side.
Edit ~/.aibutler/config.yaml:
configurations:
mcp:
servers:
- name: clarifyprompt
command: clarifyprompt-mcp
env:
LLM_API_URL: "http://localhost:11434/v1"
LLM_MODEL: "qwen3-vl:8b"
Restart AI Butler. The boot log confirms the tools are wired in:
The agent enumerates the full surface on request β every tool prefixed with clarifyprompt.:
!AI Butler webchat showing the agent listing the clarifyprompt tools with one-line descriptions
πΈ Screenshots above are from a 1.2-era integration (11 tools). Current
1.6.xexposes 23 tools βoptimize_prompt,clarify_with_user,ground_prompt,critique_prompt,compose_prompt, plus the management / inspection / memory tools (memory_search,memory_remember,memory_forget,memory_list_facts, knowledge-pack tools, traces, custom platforms, etc.). AI Butler picks them up automatically via the MCPtools/listdiscovery; no config changes needed.
Drive the Context Engine end-to-end
You can preview what the engine would gather (without running the optimization) using inspect_context:
Then run the actual optimizer for any of the 60+ supported platforms:
Every optimization gets a single JSONL line in ~/.clarifyprompt/traces/YYYY-MM-DD.jsonl β strictly local, never uploaded. The list_traces tool turns that into a queryable summary with replay support via get_trace:
The full integration walkthrough β including all 11 tools driven from chat, configuration options, and natural-language usage examples β is in the AI Butler docs: Integrate an MCP Server.
Supported Platforms (58+ built-in, unlimited custom)
| Category | Platforms | Default | |----------|-----------|---------| | Image (11) | Midjourney, DALL-E 3, Stable Diffusion, Flux, Ideogram, Leonardo AI, Adobe Firefly, Grok Aurora, Google Imagen 3, Recraft, Higgsfield | Midjourney | | Video (12) | Sora, Runway Gen-3, Pika Labs, Kling AI, Luma, Minimax/Hailuo, Google Veo 2, Wan, HeyGen, Synthesia, CogVideoX, Higgsfield | Runway | | Chat (9) | Claude, ChatGPT, Gemini, Llama, DeepSeek, Qwen, Kimi, GLM, Minimax | Claude | | Code (9) | Claude, ChatGPT, Cursor, GitHub Copilot, Windsurf, DeepSeek Coder, Qwen Coder, Codestral, Gemini | Claude | | Document (8) | Claude, ChatGPT, Gemini, Jasper, Copy.ai, Notion AI, Grammarly, Writesonic | Claude | | Voice (7) | ElevenLabs, OpenAI TTS, Fish Audio, Sesame, Google TTS, PlayHT, Kokoro | ElevenLabs | | Music (4) | Suno AI, Udio, Stable Audio, MusicGen | Suno |
Tools
optimize_prompt
The main tool. Optimizes a prompt for a specific AI platform.
{
"prompt": "a cat sitting on a windowsill",
"category": "image",
"platform": "midjourney",
"mode": "concise"
}
All parameters except prompt are optional. When category and platform are omitted, ClarifyPrompt auto-detects them from the prompt content.
Three calling modes:
| Mode | Example | |------|---------| | Zero-config | { "prompt": "sunset over mountains" } | | Category only | { "prompt": "...", "category": "image" } | | Fully explicit | { "prompt": "...", "category": "image", "platform": "dall-e" } |
Parameters:
| Parameter | Required | Description | |-----------|----------|-------------| | prompt | Yes | The prompt to optimize | | category | No | chat, image, video, voice, music, code, document. Auto-detected when omitted. | | platform | No | Platform ID (e.g. midjourney, dall-e, sora, claude). Uses category default when omitted. | | mode | No | Output style: concise, detailed, structured, step-by-step, bullet-points, technical, simple. Default: detailed. | | enrich_context | No | Set true to use web search for context enrichment. Default: false. | | session_id | No | Stitches related optimizations together so session memory can bias subsequent calls. Auto-generated when omitted. | | file_path | No | Active file path β infers language and shapes platform hints. | | file_language | No | Explicit language override for the active file. | | file_excerpt | No | Short excerpt (β€2 KB) of the active file to ground the rewrite. | | cwd | No | Working directory to scan for CLAUDE.md / AGENTS.md / .cursorrules / package.json. Defaults to server cwd. | | user_locale | No | Locale hint (e.g. en-US, ar-EG) to inform tone and language. | | user_pinned_instructions | No | Pinned, always-applied user instructions (short core-memory block). | | include_bundle | No | Include the resolved ContextBundle summary in the response. Default: false. | | skip_intent_resolution | No | Skip the intent classifier LLM call (faster; loses intent signal). Default: false. |
Response (1.2.0):
{
"id": "opt_mo9vlg9i_foohjx",
"sessionId": "sess_mo9vlfn3_abc123",
"originalPrompt": "a dragon flying over a castle at sunset",
"optimizedPrompt": "a majestic dragon flying over a medieval castle at sunset --ar 16:9 --v 6.1 --style raw --q 2 --s 700",
"category": "image",
"platform": "midjourney",
"mode": "concise",
"modeSource": "analyzer",
"analysis": {
"category": "image",
"intent": "creative-media",
"recommendedMode": "detailed",
"confidence": "high",
"source": "llm"
},
"grounding": {
"sources": ["project-rules", "workspace-meta", "target-model", "platform-hints"],
"acceptedExamplesUsed": 0
},
"shape": {
"systemPromptBudget": "standard",
"maxTokens": 2048,
"temperature": 0.9
},
"metadata": {
"model": "qwen2.5:14b-instruct-q4_K_M",
"processingTimeMs": 3911,
"strategy": "ImageStrategy"
},
"detection": { "autoDetected": true, "detectedCategory": "image", "detectedPlatform": "midjourney", "confidence": "high" },
"intent": { "detected": "creative-media", "confidence": "high" }
}
The canonical classification field is analysis. The detection and intent fields are deprecated aliases kept for 1.x back-compat; they will be removed in 2.x.
modeSource tells you how the final mode was decided (user if you passed one, analyzer if intent-driven, default if neither).
grounding.sources lists which Grounding Context sections contributed, in priority order. grounding.acceptedExamplesUsed tells you how many few-shot examples the engine pulled from save_outcome history.
shape tells you how the system prompt was sized for your target model.
clarify_with_user (new in 1.4.0)
Given an ambiguous draft prompt, returns 1β3 targeted clarifying questions instead of guessing. Use it as a pre-stage before optimize_prompt when you can't tell whether the user's request will produce a good rewrite.
{
"prompt": "make it better",
"force": true
}
Response:
{
"clarificationNeeded": true,
"reason": "Clarification recommended (analyzer confidence=low; intent=unknown; prompt is short (12 chars); caller passed force=true).",
"questions": [
{
"question": "What outcome do you want from this prompt β what does success look like?",
"reasoning": "The draft is ambiguous on the goal/audience dimension; pinning this typically resolves most downstream ambiguity.",
"suggestedAnswer": "Make the email shorter, clearer, and more action-oriented.",
"options": ["Make it shorter", "Make it more formal", "Make it more persuasive"],
"dimension": "goal"
}
],
"analysis": { "category": "chat", "intent": "unknown", "confidence": "low" }
}
suggestedAnswer is always populated β the caller can accept it verbatim and keep moving. options






