Skip to content

feat: add agentic-ux skill for fully agentic MCP UI shell - #47

Closed
carlosvin wants to merge 2 commits into
mainfrom
cursor/agentic-ux-skill-fead
Closed

carlosvin wants to merge 2 commits into
mainfrom
cursor/agentic-ux-skill-fead

Conversation

@carlosvin

@carlosvin carlosvin commented Oct 3, 2026 •

Copy link
Copy Markdown
Owner

Adds the agentic-ux skill contract for the fully agentic mode: thin prompt shell with no domain screens, full tool surface, tool-linked MCP UI resources (_meta.ui.resourceUri, AppRenderer, sandboxed iframe), UI-action mapping, and security rules.

Rebased onto main after #46 (agentic-style prompt-first with bottom-pinned composer). The skill now shares that vocabulary — conversation stage plus bottom-pinned composer and hero empty state — while drawing the line: prompt-first keeps AppNavbar, drill-down routes, and loaders; agentic-ux has none of those and renders every view as a tool resource. browserContext reuses the captureBrowserContext() shape minus location fields.

Scope is skill-only: no src/ shell, no PROMPT_CONCEPT=agentic value, no third Netlify site yet. The shell implementation follows in a second PR with its own deploy preview.

Validation: pnpm skills:check, pnpm test:skill-evals (25/25), pnpm test (146/146), pnpm build.

Open in Web Open in Cursor 

@netlify

netlify Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for fullstack-promptable-app-example ready!

Name Link
🔨 Latest commit 9dc03f9
🔍 Latest deploy log https://app.netlify.com/projects/fullstack-promptable-app-example/deploys/6ac157886192b000089acc02
😎 Deploy Preview https://deploy-preview-47--fullstack-promptable-app-example.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify

netlify Bot commented Oct 3, 2026 •

Copy link
Copy Markdown

✅ Deploy Preview for fullstack-promptable-prompt-first ready!

Name Link
🔨 Latest commit 9dc03f9
🔍 Latest deploy log https://app.netlify.com/projects/fullstack-promptable-prompt-first/deploys/6ac157890893840008ef8a85
😎 Deploy Preview https://deploy-preview-47--fullstack-promptable-prompt-first.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@carlosvin
carlosvin marked this pull request as ready for review October 3, 2026 09:12
Copilot AI balanced review requested due to automatic review settings October 3, 2026 09:12
Co-authored-by: carlosvin <carlosvin@gmail.com>
@cursor
cursor Bot force-pushed the cursor/agentic-ux-skill-fead branch from f8424dc to 83edc11 Compare October 3, 2026 09:14

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

Missing Waza coverage blocks CI, and the action contract conflates MCP Apps handlers with legacy callbacks.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
What changed in this PR

Adds a skill contract for a tool-only agentic shell, distinct from #46’s route-based prompt-first UI. No application shell or deployment changes are included.

Changes:

  • Defines shell layout, MCP UI rendering, actions, and security rules.
  • Registers the skill in companion documentation.
  • Adds static contract checks and a Waza evaluation suite.
File Description
skills/​README.md Lists the new skill and installation command.
scripts/​skills/​runSkillEvals.mjs Adds static contract checks.
evals/​agentic-ux/​tasks/​agentic-ui-action-tool.yaml Adds widget-action evaluation.
evals/​agentic-ux/​tasks/​agentic-shell-layout.yaml Adds shell-layout evaluation.
evals/​agentic-ux/​tasks/​agentic-mcp-ui-render.yaml Adds resource-rendering evaluation.
evals/​agentic-ux/​tasks/​agentic-anti-route-components.yaml Covers route-based UX exclusions.
evals/​agentic-ux/​tasks/​agentic-anti-architecture.yaml Covers architecture exclusions.
evals/​agentic-ux/​eval.yaml Configures the mock evaluation suite.
.agents/​skills/​tanstack-promptable-fullstack-app-template/​SKILL.md Registers the agentic companion.
.agents/​skills/​reference-tech-stack/​SKILL.md Links future MCP UI package guidance.
.agents/​skills/​promptable-ux/​SKILL.md Distinguishes the tool-only companion.
.agents/​skills/​observability-and-env/​SKILL.md Registers the agentic companion.
.agents/​skills/​agentic-ux/​SKILL.md Defines the fully agentic UX contract.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread evals/agentic-ux/eval.yaml
Comment thread .agents/skills/agentic-ux/SKILL.md Outdated
AppRenderer uses onCallTool, onMessage, and onOpenLink.
The five onUIAction types stay on UIResourceRenderer only.

Co-authored-by: carlosvin <carlosvin@gmail.com>
@cursor

cursor Bot commented Oct 3, 2026

Copy link
Copy Markdown
Contributor

Combined into #48, including the AppRenderer docs fix. Merge #48 only so the skill is not applied twice.

@carlosvin carlosvin closed this Oct 3, 2026
carlosvin added a commit that referenced this pull request Oct 6, 2026
<!-- CURSOR_AGENT_PR_BODY_BEGIN -->
Combines the `agentic-ux` skill from #47 with the deployable example.
Merge this pull request only.

## Deploy previews (this PR)

Each linked Netlify site builds a deploy preview for this pull request.
Smoke-test the agentic shell on its own preview. Side and prompt-first
stay on theirs.

| Demo | Netlify project | Deploy preview |
|------|-----------------|----------------|
| Side drawer | `fullstack-promptable-app-example` |
https://deploy-preview-48--fullstack-promptable-app-example.netlify.app
|
| Prompt-first | `fullstack-promptable-prompt-first` |
https://deploy-preview-48--fullstack-promptable-prompt-first.netlify.app
|
| **Fully agentic** | `fullstack-promptable-agentic` |
https://deploy-preview-48--fullstack-promptable-agentic.netlify.app |

The agentic preview uses `PROMPT_CONCEPT=agentic` and
`DISPLAY_NAME=TaskHub Agentic`. It shows the thin shell: identity,
conversation stage, and bottom composer. It does not show the drawer,
the prompt-first bar, or task pages.

Production after merge: https://fullstack-promptable-agentic.netlify.app

The empty stage is a centered hero with view starters (`Show my tasks`,
`Show pending tasks`, `Show high priority tasks`). Provider failures
render as a short alert. Task cards show status and priority, and a
click opens that task's detail view directly. "My tasks" is not filtered
to the demo visitor email. After a list, the model is asked for one
sentence instead of repeating every row.

Those rules are the `agentic-ux` skill contract (v0.2.7), not only the
example. The skill covers the hero, sentence-case tool status, short
error alerts, one-sentence answers, the demo-assignee filter, guest
cards without raw ids, and opening a named item without another model
turn. The skill eval checks the example still implements each one.

The skill defines a tool-only shell: identity, a conversation stage, and
a bottom-pinned composer. Views come from MCP Apps resources. The
example follows the [recommended MCP Apps
pattern](https://github.com/MCP-UI-Org/mcp-ui#mcp-apps-pattern-recommended)
and TanStack AI MCP registration:

- View tools and their `ui://` documents are registered with
`@tanstack/ai-mcp` `createMCPServer` and `resourceDefinition`. Each tool
sets `metadata._meta.ui.resourceUri` only. The handler returns task data
and does not attach `readResource`.
- Agentic chat calls `createMCPClient` and passes it to `chat({ mcp: {
clients } })`. Discovery stamps `metadata.mcp.uiResourceUri`, and
`MCPManager` binds `resources/read`. The same server is mounted at
`/api/mcp`. Side and prompt-first chats do not connect this client.
- The view document is a static file wrapped once with `@mcp-ui/server`
`createUIResource` (`text/html;profile=mcp-app`). Task rows are not
embedded in the HTML.
- The tool result stays model-facing data only. The shell renders the
`UIResourcePart` with `AppRenderer` from `@mcp-ui/client`, passing
`toolInput` and `toolResult`. The guest handles `ontoolresult` and
writes text with `textContent`. `sandbox.url` is
`public/sandbox_proxy.html`, which keeps the guest in an inner iframe
with no `allow-same-origin`. Prompts and links go through
`useMcpAppBridge`. The guest uses `@modelcontextprotocol/ext-apps` `App`
from `public/mcp-app.js` (`sendMessage`, `openLink`).
- Links are limited to `http`, `https`, and `mailto`. Widget buttons
send a follow-up prompt. `POST /api/mcp-apps/call` refuses a direct
widget tool call, so writes stay on the chat tools and the auth ticket.
- Server `execute` and client `.client()` handlers receive arguments
already parsed by `inputSchema` and pass them through. They do not parse
those arguments again.

The architecture skill asks which UX to follow before building chrome.
If the user does not choose, the default is **prompt-first**. Side and
agentic stay explicit choices. This template's three Netlify sites keep
their existing `PROMPT_CONCEPT` values.

The example selects the agentic shell with `PROMPT_CONCEPT=agentic`. It
does not mount the drawer, the prompt-first bar, the navbar, or domain
pages. `showTasksView` and `showTaskView` produce the inline views.
There is no `navigate` or `invalidateRouter` on this concept.

The site `fullstack-promptable-agentic` is linked to this repo with
`PROMPT_CONCEPT=agentic`, `DISPLAY_NAME=TaskHub Agentic`, and
`REPOSITORY_TYPE=seed` on production and deploy-preview. Side and
prompt-first previews stay on their own sites.

<!-- CURSOR_AGENT_PR_BODY_END -->

<div><a
href="https://cursor.com/agents/bc-eff48804-49e4-42dc-9576-d89c4b54fead?cursor_ref=pr_footer&cursor_cta=open_in_web"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-web-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-web-light.png"><img
alt="Open in Web" width="114" height="28"
src="https://cursor.com/assets/images/open-in-web-dark.png"></picture></a>&nbsp;<a
href="https://cursor.com/background-agent?bcId=bc-eff48804-49e4-42dc-9576-d89c4b54fead&cursor_ref=pr_footer&cursor_cta=open_in_cursor"><picture><source
media="(prefers-color-scheme: dark)"
srcset="https://cursor.com/assets/images/open-in-cursor-dark.png"><source
media="(prefers-color-scheme: light)"
srcset="https://cursor.com/assets/images/open-in-cursor-light.png"><img
alt="Open in Cursor" width="131" height="28"
src="https://cursor.com/assets/images/open-in-cursor-dark.png"></picture></a>&nbsp;</div>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants