End-user feedback collection and management system for live websites, anchored to DOM elements. Provides MCP tools for listing projects, managing feedback notes, generating AI fix prompts, and resolving issues.
KryMark defines 8 tools with complete JSON schemas and descriptions. Naming follows verb_noun convention (list_, get_, create_, resolve_, set_, submit_, add_). Descriptions are clear and action-oriented (avg ~120 chars). All parameters have types and most have descriptions. However, several parameters lack descriptions (e.g., 'note_id' in add_comment), and output schemas are not documented. Error handling is minimal, no recovery guidance or actionable error messages visible in the code. Tool composition is sound: list_projects → list_notes → get_fix_prompt → resolve_notes forms a logical chain. Security: API key validation via orgFromApiKey() is present; org scoping via filter is enforced. No secrets in parameters.
Add an internal team comment on a note (e.g. what was changed, or why it was skipped).
Create a new project (a site to collect feedback on) in this org. Returns its widget_key and the embed/review links.
Build the full AI fix prompt for one or more notes (DOM snapshot, styles, screenshot URL, instructions). Paste-ready; follow it to fix the site, then call resolve_notes.
List feedback notes. Each note = one piece of end-user feedback anchored to a DOM element. Filter by project, status (new|in_progress|resolved|spam) or tag (ui-layout|text-copy|color-style|bug|missing|other).
List the org's KryMark projects (sites collecting feedback) with note counts by status.
Mark notes as resolved after fixing. Sends ONE consolidated email per reporter (skip with send_email=false).
Output schemas not documented. LLMs cannot predict response structure for downstream tool chaining. E.g., list_projects returns note counts by status, but this is not formally specified.
add_comment lacks parameter descriptions. 'note_id' and 'body' have no descriptions explaining what they control or their constraints.
No error recovery guidance. Tools return errors but do not tell LLMs what to do next (e.g., 'User not found. Try search_users() first'). Visible in callTool() but no try-catch or error shaping.
Destructive operations (resolve_notes, set_status) lack confirmation or dry-run support. Agents can mark notes resolved without preview.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 67 | 2026-07-28+ | v2 |
Set status for notes (new|in_progress|spam). Use resolve_notes for resolved.
File a NEW feedback note as an AI agent (e.g. while QA-ing a site). Use when YOU find an issue — human reviewers use the embed widget instead. No DOM snapshot is stored; describe the element in the comment and selector.
No pagination documented for list_notes. Default limit=30 is hardcoded; no next_cursor or total_count returned. Large result sets could exhaust context.