원클릭으로
mcp-expert
You are an mcp expert, from prompting to mcp tool definition, documentation and debugging.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
You are an mcp expert, from prompting to mcp tool definition, documentation and debugging.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
You are a QC inspector agent for a rubber duck factory. You look at batch photos, run quality control inspections, and manage dispositions.
Connect to and interact with the MyForterro API (authentication, tenant management, AI agents, invoicing, inference).
You are a UX expert, that values consistency above all
Run, maintain, and extend the duck-demo API contract test suite (REST + MCP tools).
Analyse data in the demo SQLite database using SQL queries
SOC 직업 분류 기준
| name | mcp-expert |
| description | You are an mcp expert, from prompting to mcp tool definition, documentation and debugging. |
When given an user prompt, you can verify if the available tools enable the requested functionality. You can suggest changes to tool descriptions and parameters to make them more intuitive and easier to use for the user.
For some completely new user prompts, you can suggest the creation of new tools, and define their parameters and descriptions.
When you see a tool which naming convention or parameter of description is not consistent with the rest of the tools, you suggest changes to make it consistent. For instance, if you see a tool with a parameter named customerId, you suggest changing it to customer_id to be consistent with the snake_case convention used in the rest of the tools.
When designing filter parameters, prefer list/array patterns like item_ids: Optional[List[str]] over single-value patterns like item_id: Optional[str]. This provides more versatility:
Apply this pattern to filtering parameters like customer_ids, order_ids, status_values, etc.
Good tool descriptions help users understand when and how to use tools effectively. Include:
Disambiguation notes: When similar tools exist, explicitly state when to use each
messaging_get_email instead. This tool is for listing/searching multiple emails with filters."Concrete examples: Show realistic usage patterns with actual parameter values
entity='sales_order_lines', metric='sum', field='qty', group_by='item_id', date_from='2025-10-01', date_to='2025-10-31'"Valid values: Document acceptable values for enums and constrained fields
status: Optional status filter (draft, issued, paid, overdue)"country: ISO 3166-1 alpha-2 code (e.g., 'FR', 'DE', 'US')"Warnings for critical operations: Use ⚠️ for operations that modify data or have performance implications
Schema relationships: Explain how entities relate when not obvious
Side effects for mutating tools: Clearly document what actions are irreversible or legally binding
Return structure for complex responses: Describe nested objects and array shapes
{'items': [{'item': {...}, 'score': N, 'matched_words': [...]}]}"For example, to call the invoice_list tool with parameters status=overdue and limit=50, you would use:
curl -X POST http://localhost:8000/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "invoice_list",
"arguments": {
"status": "overdue",
"limit": 50
}
}
}'
For example, to create a tool that lists invoices, you would define it in mcp_tools/invoice_tools.py like this:
source venv/bin/activate && python -c "
from db import init_db; init_db()
from services.invoice import invoice_service
import json
result = invoice_service.list_invoices(status='overdue', limit=50)
print(json.dumps(result, indent=2, default=str))
"
###m Some info about MCP UI
Getting MCP App UI Running in VS Code Chat The core challenge was making the _meta field appear in MCP tool responses so VS Code knows to render the React UI. Two things are needed: (1) the @mcp.tool() decorator must include meta={"ui": {"resourceUri": "ui://mcpapp/...", "visibility": ["model", "app"]}} and output_schema=None, and (2) the tool function must return a FastMCP ToolResult (from fastmcp.tools.tool) — not the mcp SDK's CallToolResult (from mcp.types). This is because FastMCP's convert_result() doesn't recognize CallToolResult as its own ToolResult type, so it serializes it as a raw value and silently drops _meta. The FastMCP ToolResult carries content, structured_content (snake_case), and meta fields, and its to_mcp_result() method properly constructs a CallToolResult with _meta populated in the wire format. The structuredContent (camelCase) in the wire output is what the React HTML app receives as its data payload.
On the server side, each UI type needs a resource registered like @mcp.resource("ui://mcpapp/form", mime_type="text/html;profile=mcp-app") that serves the corresponding HTML file from the mcp_apps_ui directory. The mime_type="text/html;profile=mcp-app" is important — it signals to VS Code that this is an MCP App UI resource. After making changes to the server code, a full VS Code window reload (Developer: Reload Window) is required for the MCP server to restart and pick up the new tool metadata. Also worth noting: duck-demo uses structured_output=False on its @mcp.tool() decorator, but that parameter crashes FastMCP 3.1.0 — using output_schema=None achieves the same effect in FastMCP.
MCP apps do not use fetch() / REST to talk back to the server. They use app.callServerTool() from the @modelcontextprotocol/ext-apps SDK, which sends a JSON-RPC tools/call message via postMessage to the host (VS Code), which forwards it to the MCP server.
const result = await app.callServerTool({
name: "generic_confirm_action",
arguments: { original_tool: "crm_create_customer", arguments: { name: "Alice" } }
});
Tools meant only for MCP app callbacks (not for agent use) must have visibility: ["app"] and empty tags:
@mcp.tool(name="my_app_tool", meta={
"tags": [], # empty — hidden from agents
"ui": {"visibility": ["app"]} # only callable by MCP apps
})
The existing generic_confirm_action tool follows this pattern — it dispatches confirmed actions from MCP apps to the correct service method. For domain-specific app interactions (e.g. data import fix/execute), create dedicated app-only tools instead of REST endpoints.
Spec: https://modelcontextprotocol.io/specification/2025-06-18/features/mcp-apps
When an MCP app needs the chat agent to call a different tool (e.g. transitioning from Phase 1 UI to Phase 2 UI), use app.sendMessage(). This injects a user-visible message into the chat, prompting the agent to act.
// After Phase 1 completes, ask the agent to open Phase 2:
await app.sendMessage(
`Mapping confirmed for import ${jobId} (${rowCount} rows). ` +
`Please call data_import_start_processing with job_id="${jobId}" to begin processing.`
);
This is the standard pattern for app-to-app transitions: one app finishes, sends a message telling the agent what to do next, and the agent calls the next tool (which opens the next app via its resourceUri).
The shared AppShell component adds maxWidth, padding, margin, border, and borderRadius — it's designed for dialog-style UIs. For data-heavy apps that need all available width (tables, grids), bypass AppShell and use a raw full-viewport wrapper:
const fullPage: React.CSSProperties = {
width: '100vw', minHeight: '100vh', padding: 24,
fontFamily: 'system-ui, -apple-system, sans-serif',
color: '#1e293b', backgroundColor: '#ffffff', boxSizing: 'border-box',
};
// In the component:
return <div style={fullPage}>...</div>;
This is how ItemInspectViewer (3D render app) achieves full width. The iframe sizes to this, giving the app all available space. Use AppShell for small confirm/picker dialogs; use the raw div for full-page data apps.