{
  "$schema": "https://shadcn-vue.com/schema/registry-item.json",
  "name": "mcp-server-registry-manager",
  "title": "Mcp Server Registry Manager",
  "type": "registry:page",
  "files": [
    {
      "path": "packages/registry-vue/blocks/mcp-server-registry-manager/McpServerRegistryManager.vue",
      "content": "<script setup lang=\"ts\">\nimport { computed, ref } from 'vue'\nimport type { HTMLAttributes } from 'vue'\nimport { Check, CheckCircle2, Copy, Plus, Radio, RefreshCw, Search, Server, Terminal, X } from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs'\n\nimport { defaultServers } from './mcp-server-registry-data'\nimport type { McpServer, ToolSchema } from './mcp-server-registry-types'\nimport McpHandshakeLogsTable from './McpHandshakeLogsTable.vue'\nimport McpInstallServerDialog from './McpInstallServerDialog.vue'\nimport McpKpiCards from './McpKpiCards.vue'\nimport McpServerCard from './McpServerCard.vue'\nimport McpToolInspectorDrawer from './McpToolInspectorDrawer.vue'\n\nexport type {\n  McpServer,\n  ResourceTemplate,\n  ServerStatus,\n  ToolParam,\n  ToolSchema,\n  TransportType,\n} from './mcp-server-registry-types'\n\ninterface Props {\n  class?: HTMLAttributes['class']\n  initialSearch?: string\n  initialTransportFilter?: 'all' | 'stdio' | 'sse'\n  initialStatusFilter?: 'all' | 'healthy' | 'reconnecting'\n  initialSelectedToolName?: string\n  initialDrawerOpen?: boolean\n  initialInstallDialogOpen?: boolean\n  initialHandshakeAlert?: boolean\n  initialServers?: McpServer[]\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n  initialSearch: '',\n  initialTransportFilter: 'all',\n  initialStatusFilter: 'all',\n  initialDrawerOpen: false,\n  initialInstallDialogOpen: false,\n  initialHandshakeAlert: false,\n})\n\n// State Management\nconst servers = ref<McpServer[]>(props.initialServers ? [...props.initialServers] : [...defaultServers])\nconst searchQuery = ref(props.initialSearch)\nconst transportFilter = ref<'all' | 'stdio' | 'sse'>(props.initialTransportFilter)\nconst statusFilter = ref<'all' | 'healthy' | 'reconnecting'>(props.initialStatusFilter)\nconst isDrawerOpen = ref(props.initialDrawerOpen)\nconst isInstallDialogOpen = ref(props.initialInstallDialogOpen)\nconst handshakeAlertVisible = ref(props.initialHandshakeAlert)\nconst isHandshaking = ref(false)\nconst copiedKey = ref<string | null>(null)\nconst inspectorTab = ref<'request' | 'response' | 'schema'>('request')\nconst activeViewTab = ref<'servers' | 'handshake-logs' | 'config-json'>('servers')\n\n// Inspector state\nconst selectedServer = ref<McpServer>(servers.value[0] ?? defaultServers[0])\nconst selectedTool = ref<ToolSchema>(servers.value[0]?.tools[0] ?? defaultServers[0].tools[0])\n\n// Initialize selected tool if provided\nif (props.initialSelectedToolName) {\n  for (const s of servers.value) {\n    const t = s.tools.find((tool) => tool.name === props.initialSelectedToolName)\n    if (t) {\n      selectedServer.value = s\n      selectedTool.value = t\n      break\n    }\n  }\n}\n\n// Dry Run state\nconst isDryRunning = ref(false)\nconst dryRunOutput = ref<string | null>(null)\n\nfunction resetFilters() {\n  searchQuery.value = ''\n  transportFilter.value = 'all'\n  statusFilter.value = 'all'\n}\n\n// Filtering Logic\nconst filteredServers = computed(() => {\n  const q = searchQuery.value.trim().toLowerCase()\n  return servers.value.filter((s) => {\n    const matchTransport = transportFilter.value === 'all' || s.transport === transportFilter.value\n    const matchStatus = statusFilter.value === 'all' || s.status === statusFilter.value\n    if (!matchTransport || !matchStatus) return false\n\n    if (!q) return true\n    const inName = s.name.toLowerCase().includes(q)\n    const inScope = s.scope.toLowerCase().includes(q)\n    const inDesc = s.description.toLowerCase().includes(q)\n    const inCmd = s.commandOrUrl.toLowerCase().includes(q)\n    const inTools = s.tools.some((t) => t.name.toLowerCase().includes(q) || t.displayName.toLowerCase().includes(q))\n    const inUris = s.resourceTemplates.some((r) => r.uriTemplate.toLowerCase().includes(q))\n    return inName || inScope || inDesc || inCmd || inTools || inUris\n  })\n})\n\n// Counts & Metrics\nconst totalConnectedServers = computed(() => servers.value.filter((s) => s.status === 'healthy').length)\nconst totalRegisteredTools = computed(() => servers.value.reduce((acc, s) => acc + s.tools.length, 0))\nconst totalResourceTemplates = computed(() => servers.value.reduce((acc, s) => acc + s.resourceTemplates.length, 0))\nconst totalInvocationsToday = computed(() => servers.value.reduce((acc, s) => acc + s.callsToday, 0))\n\nfunction openToolInspector(server: McpServer, tool: ToolSchema) {\n  selectedServer.value = server\n  selectedTool.value = tool\n  dryRunOutput.value = null\n  isDrawerOpen.value = true\n}\n\nfunction openServerInspector(server: McpServer) {\n  if (server.tools.length > 0) {\n    openToolInspector(server, server.tools[0])\n  }\n}\n\nfunction copyToClipboard(text: string, key: string) {\n  if (typeof navigator !== 'undefined' && navigator.clipboard) {\n    navigator.clipboard.writeText(text)\n    copiedKey.value = key\n    setTimeout(() => {\n      if (copiedKey.value === key) copiedKey.value = null\n    }, 2000)\n  }\n}\n\nfunction runHandshakeTest() {\n  isHandshaking.value = true\n  handshakeAlertVisible.value = false\n  setTimeout(() => {\n    isHandshaking.value = false\n    handshakeAlertVisible.value = true\n  }, 650)\n}\n\nfunction onServerInstalled(newServer: McpServer) {\n  servers.value.unshift(newServer)\n}\n\nfunction removeServer(serverId: string) {\n  servers.value = servers.value.filter((s) => s.id !== serverId)\n}\n\nfunction restartServer(server: McpServer) {\n  server.status = 'healthy'\n  server.latencyMs = Math.floor(Math.random() * 20) + 15\n}\n\nfunction runDryRunTest() {\n  if (!selectedTool.value) return\n  isDryRunning.value = true\n  setTimeout(() => {\n    isDryRunning.value = false\n    dryRunOutput.value = JSON.stringify(selectedTool.value.sampleRpcResponse.result, null, 2)\n  }, 450)\n}\n\nconst activeMcpConfigJson = computed(() => {\n  const config: { mcpServers: Record<string, any> } = { mcpServers: {} }\n  for (const s of servers.value) {\n    const key = s.name.replace(/^mcp\\//, '')\n    if (s.transport === 'stdio') {\n      const parts = s.commandOrUrl.split(' ')\n      config.mcpServers[key] = {\n        command: parts[0],\n        args: parts.slice(1),\n        env: s.envVars.reduce((acc: Record<string, string>, ev) => {\n          const [k, v] = ev.split('=')\n          if (k && v) acc[k] = v\n          return acc\n        }, {}),\n      }\n    } else {\n      config.mcpServers[key] = {\n        transport: 'sse',\n        url: s.commandOrUrl,\n      }\n    }\n  }\n  return JSON.stringify(config, null, 2)\n})\n</script>\n\n<template>\n  <div\n    data-slot=\"mcp-server-registry-manager\"\n    :class=\"\n      cn(\n        'bg-background text-foreground border-border w-full space-y-6 overflow-hidden rounded-xl border p-4 shadow-xs sm:p-6 md:p-8',\n        props.class,\n      )\n    \"\n  >\n    <!-- Top System Header -->\n    <header class=\"flex flex-col gap-4 lg:flex-row lg:items-center lg:justify-between\">\n      <div class=\"space-y-1.5\">\n        <div class=\"flex flex-wrap items-center gap-2.5\">\n          <div\n            class=\"bg-primary/10 text-primary border-primary/20 flex size-9 items-center justify-center rounded-lg border\"\n          >\n            <Server class=\"size-4.5\" />\n          </div>\n          <h1 class=\"text-xl font-bold tracking-tight sm:text-2xl\">Model Context Protocol (MCP) Server Manager</h1>\n        </div>\n        <div class=\"text-muted-foreground flex flex-wrap items-center gap-2 text-xs\">\n          <Badge variant=\"secondary\" class=\"font-mono text-xs font-normal\"> MCP Spec 2024-11-05 · JSON-RPC 2.0 </Badge>\n          <span>•</span>\n          <span class=\"text-success inline-flex items-center gap-1.5 font-medium\">\n            <span class=\"bg-success flex size-2 animate-pulse rounded-full\" />\n            {{ totalConnectedServers }} Connected · {{ totalRegisteredTools }} Tools Active\n          </span>\n          <span class=\"hidden sm:inline\">•</span>\n          <span class=\"hidden sm:inline\">Anthropic Runtime & Agent Registry</span>\n        </div>\n      </div>\n\n      <!-- Action CTA Buttons -->\n      <div class=\"flex flex-wrap items-center gap-2.5\">\n        <Button\n          variant=\"outline\"\n          size=\"sm\"\n          class=\"h-9 gap-1.5 text-xs font-medium\"\n          :disabled=\"isHandshaking\"\n          @click=\"runHandshakeTest\"\n        >\n          <RefreshCw :class=\"cn('size-3.5', isHandshaking && 'text-primary animate-spin')\" />\n          <span>{{ isHandshaking ? 'Handshaking...' : 'Test Tool Handshake' }}</span>\n        </Button>\n\n        <Button size=\"sm\" class=\"h-9 gap-1.5 text-xs font-medium shadow-xs\" @click=\"isInstallDialogOpen = true\">\n          <Plus class=\"size-3.5\" />\n          <span>Install New MCP Server</span>\n        </Button>\n      </div>\n    </header>\n\n    <!-- Handshake Diagnostic Alert Banner -->\n    <div\n      v-if=\"handshakeAlertVisible\"\n      class=\"border-success/30 bg-success/10 text-foreground dark:text-foreground flex items-start justify-between rounded-lg border p-3.5 text-xs transition-colors\"\n    >\n      <div class=\"flex items-start gap-2.5\">\n        <CheckCircle2 class=\"text-success mt-0.5 size-4 shrink-0\" />\n        <div class=\"space-y-0.5\">\n          <p class=\"text-success font-semibold\">Handshake Verified · All 6 MCP Servers Responded (Avg 42ms)</p>\n          <p class=\"text-success\">\n            34 tool schemas, 18 resource templates, and prompt interfaces validated against MCP Specification\n            2024-11-05.\n          </p>\n        </div>\n      </div>\n      <button\n        aria-label=\"Dismiss notification\"\n        class=\"text-success hover:text-foreground rounded-md p-1 transition-colors\"\n        @click=\"handshakeAlertVisible = false\"\n      >\n        <X class=\"size-3.5\" />\n      </button>\n    </div>\n\n    <!-- 4 MCP System KPI Cards -->\n    <McpKpiCards\n      :servers-count=\"servers.length\"\n      :healthy-count=\"totalConnectedServers\"\n      :reconnecting-count=\"servers.length - totalConnectedServers\"\n      :tools-count=\"totalRegisteredTools\"\n      :resource-templates-count=\"totalResourceTemplates\"\n      :invocations-today=\"totalInvocationsToday\"\n    />\n\n    <!-- Main Content Navigation & Filter Bar -->\n    <div class=\"space-y-4\">\n      <div class=\"flex flex-col gap-3 md:flex-row md:items-center md:justify-between\">\n        <!-- View Tabs -->\n        <Tabs v-model=\"activeViewTab\" class=\"w-full md:w-auto\">\n          <TabsList class=\"grid h-9 w-full max-w-[380px] grid-cols-3 md:w-full\">\n            <TabsTrigger value=\"servers\" class=\"text-xs\"> Servers & Tools ({{ servers.length }}) </TabsTrigger>\n            <TabsTrigger value=\"handshake-logs\" class=\"text-xs\"> Handshake Logs </TabsTrigger>\n            <TabsTrigger value=\"config-json\" class=\"text-xs\"> Raw JSON Config </TabsTrigger>\n          </TabsList>\n        </Tabs>\n\n        <!-- Search Bar and Transport Filters -->\n        <div class=\"flex flex-wrap items-center gap-2\">\n          <div class=\"relative w-full sm:w-64\">\n            <Search class=\"text-muted-foreground absolute top-1/2 left-2.5 size-3.5 -translate-y-1/2\" />\n            <Input\n              v-model=\"searchQuery\"\n              placeholder=\"Search servers, tools, URIs...\"\n              class=\"bg-background h-8.5 pl-8 text-xs\"\n            />\n          </div>\n\n          <!-- Transport Filter Buttons -->\n          <div class=\"border-border bg-muted/40 flex items-center rounded-lg border p-0.5 text-xs\">\n            <button\n              :class=\"\n                cn(\n                  'rounded-md px-2.5 py-1 font-medium transition-colors',\n                  transportFilter === 'all'\n                    ? 'bg-background text-foreground shadow-xs'\n                    : 'text-muted-foreground hover:text-foreground',\n                )\n              \"\n              @click=\"transportFilter = 'all'\"\n            >\n              All\n            </button>\n            <button\n              :class=\"\n                cn(\n                  'inline-flex items-center gap-1 rounded-md px-2.5 py-1 font-medium transition-colors',\n                  transportFilter === 'stdio'\n                    ? 'bg-background text-foreground shadow-xs'\n                    : 'text-muted-foreground hover:text-foreground',\n                )\n              \"\n              @click=\"transportFilter = 'stdio'\"\n            >\n              <Terminal class=\"size-3\" />\n              stdio\n            </button>\n            <button\n              :class=\"\n                cn(\n                  'inline-flex items-center gap-1 rounded-md px-2.5 py-1 font-medium transition-colors',\n                  transportFilter === 'sse'\n                    ? 'bg-background text-foreground shadow-xs'\n                    : 'text-muted-foreground hover:text-foreground',\n                )\n              \"\n              @click=\"transportFilter = 'sse'\"\n            >\n              <Radio class=\"size-3\" />\n              SSE Stream\n            </button>\n          </div>\n        </div>\n      </div>\n\n      <!-- Tab View 1: Servers & Tools List -->\n      <div v-if=\"activeViewTab === 'servers'\" class=\"space-y-4\">\n        <!-- Empty State -->\n        <div\n          v-if=\"filteredServers.length === 0\"\n          class=\"border-border bg-card/40 flex flex-col items-center justify-center rounded-xl border border-dashed p-10 text-center\"\n        >\n          <Server class=\"text-muted-foreground/60 mb-3 size-10\" />\n          <h3 class=\"text-sm font-semibold\">No MCP Servers Found</h3>\n          <p class=\"text-muted-foreground mt-1 max-w-sm text-xs\">\n            No servers match your current search query or filter criteria. Clear filters or add a new MCP server\n            connection.\n          </p>\n          <Button size=\"sm\" variant=\"outline\" class=\"mt-4 h-8 text-xs\" @click=\"resetFilters\"> Reset Filters </Button>\n        </div>\n\n        <!-- Servers Cards -->\n        <McpServerCard\n          v-for=\"server in filteredServers\"\n          :key=\"server.id\"\n          :server=\"server\"\n          :copied-key=\"copiedKey\"\n          @open-tool-inspector=\"openToolInspector(server, $event)\"\n          @open-server-inspector=\"openServerInspector(server)\"\n          @restart-server=\"restartServer(server)\"\n          @remove-server=\"removeServer(server.id)\"\n          @copy=\"copyToClipboard\"\n        />\n      </div>\n\n      <!-- Tab View 2: Handshake & Telemetry Logs -->\n      <McpHandshakeLogsTable\n        v-else-if=\"activeViewTab === 'handshake-logs'\"\n        :servers=\"servers\"\n        :is-handshaking=\"isHandshaking\"\n        @re-probe=\"runHandshakeTest\"\n      />\n\n      <!-- Tab View 3: Raw JSON Configuration -->\n      <div v-else-if=\"activeViewTab === 'config-json'\" class=\"space-y-4\">\n        <Card class=\"border-border bg-card\">\n          <CardHeader class=\"pb-3\">\n            <div class=\"flex items-center justify-between\">\n              <div>\n                <CardTitle class=\"text-sm font-bold\">Claude Desktop & Cursor MCP Config</CardTitle>\n                <CardDescription class=\"text-xs\">\n                  Exportable JSON format compatible with <code class=\"font-mono\">claude_desktop_config.json</code>.\n                </CardDescription>\n              </div>\n              <Button\n                size=\"sm\"\n                variant=\"outline\"\n                class=\"h-8 gap-1.5 text-xs\"\n                @click=\"copyToClipboard(activeMcpConfigJson, 'mcp-config-json')\"\n              >\n                <Check v-if=\"copiedKey === 'mcp-config-json'\" class=\"text-success size-3.5\" />\n                <Copy v-else class=\"size-3.5\" />\n                {{ copiedKey === 'mcp-config-json' ? 'JSON Copied!' : 'Copy Config JSON' }}\n              </Button>\n            </div>\n          </CardHeader>\n          <CardContent>\n            <pre\n              class=\"bg-muted/60 border-border text-foreground max-h-[420px] overflow-x-auto rounded-lg border p-4 font-mono text-xs leading-relaxed\"\n              >{{ activeMcpConfigJson }}</pre\n            >\n          </CardContent>\n        </Card>\n      </div>\n    </div>\n\n    <!-- Tool Schema Inspection Drawer (Sheet) -->\n    <McpToolInspectorDrawer\n      :open=\"isDrawerOpen\"\n      :server=\"selectedServer\"\n      :tool=\"selectedTool\"\n      :inspector-tab=\"inspectorTab\"\n      :copied-key=\"copiedKey\"\n      :is-dry-running=\"isDryRunning\"\n      :dry-run-output=\"dryRunOutput\"\n      @update:open=\"isDrawerOpen = $event\"\n      @update:inspector-tab=\"inspectorTab = $event\"\n      @copy=\"copyToClipboard\"\n      @run-dry-run=\"runDryRunTest\"\n    />\n\n    <!-- Install New MCP Server Dialog -->\n    <McpInstallServerDialog v-model:open=\"isInstallDialogOpen\" @install=\"onServerInstalled\" />\n  </div>\n</template>\n",
      "type": "registry:page",
      "target": "~/app/components/blocks/McpServerRegistryManager.vue"
    },
    {
      "path": "packages/registry-vue/blocks/mcp-server-registry-manager/McpHandshakeLogsTable.vue",
      "content": "<script setup lang=\"ts\">\nimport { RefreshCw } from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\nimport type { McpServer } from './mcp-server-registry-types'\n\ninterface Props {\n  servers: McpServer[]\n  isHandshaking: boolean\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<{\n  reProbe: []\n}>()\n</script>\n\n<template>\n  <div class=\"space-y-4\">\n    <Card class=\"border-border bg-card\">\n      <CardHeader class=\"pb-3\">\n        <div class=\"flex items-center justify-between\">\n          <div>\n            <CardTitle class=\"text-sm font-bold\">MCP Handshake & Protocol Event Stream</CardTitle>\n            <CardDescription class=\"text-xs\">\n              Real-time JSON-RPC 2.0 handshake pings and capability negotiation logs.\n            </CardDescription>\n          </div>\n          <Button size=\"sm\" variant=\"outline\" class=\"h-8 gap-1.5 text-xs\" @click=\"emit('reProbe')\">\n            <RefreshCw :class=\"cn('size-3.5', isHandshaking && 'animate-spin')\" />\n            Re-probe Connections\n          </Button>\n        </div>\n      </CardHeader>\n      <CardContent class=\"p-0\">\n        <div class=\"overflow-x-auto\">\n          <Table>\n            <TableHeader>\n              <TableRow class=\"hover:bg-transparent\">\n                <TableHead class=\"text-xs\">Server / Scope</TableHead>\n                <TableHead class=\"text-xs\">Transport</TableHead>\n                <TableHead class=\"text-xs\">Handshake Status</TableHead>\n                <TableHead class=\"text-xs\">Latency</TableHead>\n                <TableHead class=\"text-xs\">Tools Validated</TableHead>\n                <TableHead class=\"text-right text-xs\">Last Ping</TableHead>\n              </TableRow>\n            </TableHeader>\n            <TableBody>\n              <TableRow v-for=\"s in servers\" :key=\"s.id\" class=\"text-xs\">\n                <TableCell class=\"font-mono font-medium\">\n                  {{ s.name }}\n                </TableCell>\n                <TableCell>\n                  <Badge variant=\"secondary\" class=\"font-mono text-xs\">\n                    {{ s.transport }}\n                  </Badge>\n                </TableCell>\n                <TableCell>\n                  <span\n                    :class=\"\n                      cn(\n                        'inline-flex items-center gap-1.5 font-medium',\n                        s.status === 'healthy' ? 'text-success' : 'text-warning',\n                      )\n                    \"\n                  >\n                    <span :class=\"cn('size-1.5 rounded-full', s.status === 'healthy' ? 'bg-success' : 'bg-warning')\" />\n                    {{ s.status === 'healthy' ? 'SYN_ACK 200 OK' : 'RETRY_BACKOFF' }}\n                  </span>\n                </TableCell>\n                <TableCell class=\"text-muted-foreground font-mono\"> {{ s.latencyMs }}ms </TableCell>\n                <TableCell>\n                  <span class=\"text-foreground font-medium\">{{ s.tools.length }} schemas</span>\n                </TableCell>\n                <TableCell class=\"text-muted-foreground text-right\"> Just now </TableCell>\n              </TableRow>\n            </TableBody>\n          </Table>\n        </div>\n      </CardContent>\n    </Card>\n  </div>\n</template>\n",
      "type": "registry:page",
      "target": "~/app/components/blocks/McpHandshakeLogsTable.vue"
    },
    {
      "path": "packages/registry-vue/blocks/mcp-server-registry-manager/McpInstallServerDialog.vue",
      "content": "<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { Plus, Radio, Terminal } from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\nimport { Button } from '@/components/ui/button'\nimport {\n  Dialog,\n  DialogClose,\n  DialogContent,\n  DialogDescription,\n  DialogFooter,\n  DialogHeader,\n  DialogTitle,\n} from '@/components/ui/dialog'\nimport { Input } from '@/components/ui/input'\nimport type { McpServer, TransportType } from './mcp-server-registry-types'\n\ninterface Props {\n  open: boolean\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<{\n  'update:open': [value: boolean]\n  install: [server: McpServer]\n}>()\n\nconst newServerName = ref('')\nconst newServerScope = ref('')\nconst newTransport = ref<TransportType>('stdio')\nconst newCommandOrUrl = ref('')\nconst newDescription = ref('')\n\nfunction handleAddServer() {\n  if (!newServerName.value.trim() || !newCommandOrUrl.value.trim()) return\n\n  const newServer: McpServer = {\n    id: `server-${Date.now()}`,\n    name: newServerName.value.trim(),\n    scope: newServerScope.value.trim() || `@custom/${newServerName.value.replace(/^mcp\\//, '')}`,\n    version: 'v1.0.0',\n    transport: newTransport.value,\n    commandOrUrl: newCommandOrUrl.value.trim(),\n    status: 'healthy',\n    uptime: '100.0%',\n    latencyMs: newTransport.value === 'stdio' ? 22 : 64,\n    callsToday: 0,\n    description: newDescription.value.trim() || 'Custom registered Model Context Protocol runtime server.',\n    envVars: ['MCP_ENABLED=true'],\n    resourceTemplates: [\n      {\n        uriTemplate: `custom://${newServerName.value.replace(/^mcp\\//, '')}/{resourceId}`,\n        name: 'Custom Parameterized Resource',\n        description: 'Dynamic schema endpoint for custom tool payloads',\n        mimeType: 'application/json',\n      },\n    ],\n    tools: [\n      {\n        name: `${newServerName.value.replace(/^mcp\\//, '').replace(/[^a-zA-Z0-9_]/g, '_')}_action`,\n        displayName: 'Execute Custom Action',\n        description: 'Default action handler registered for this server.',\n        category: 'deployment',\n        parameters: [{ name: 'payload', type: 'string', required: true, description: 'Action parameter payload.' }],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-custom-001',\n          method: 'tools/call',\n          params: {\n            name: `${newServerName.value.replace(/^mcp\\//, '').replace(/[^a-zA-Z0-9_]/g, '_')}_action`,\n            arguments: { payload: 'execute' },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-custom-001',\n          result: {\n            content: [{ type: 'text', text: '{\"status\":\"success\",\"executedAt\":\"2026-08-21T12:00:00Z\"}' }],\n            isError: false,\n          },\n        },\n      },\n    ],\n  }\n\n  emit('install', newServer)\n  newServerName.value = ''\n  newServerScope.value = ''\n  newCommandOrUrl.value = ''\n  newDescription.value = ''\n  emit('update:open', false)\n}\n</script>\n\n<template>\n  <Dialog :open=\"open\" @update:open=\"emit('update:open', $event)\">\n    <DialogContent class=\"sm:max-w-lg\">\n      <DialogHeader class=\"space-y-1.5\">\n        <DialogTitle class=\"flex items-center gap-2 text-base font-bold\">\n          <Plus class=\"text-primary size-4\" />\n          Install New MCP Server\n        </DialogTitle>\n        <DialogDescription class=\"text-muted-foreground text-xs\">\n          Connect an Anthropic Model Context Protocol compliant local command or remote SSE stream.\n        </DialogDescription>\n      </DialogHeader>\n\n      <div class=\"space-y-3.5 py-2\">\n        <div class=\"space-y-1\">\n          <label class=\"text-foreground text-xs font-medium\">Server Identifier</label>\n          <Input v-model=\"newServerName\" placeholder=\"e.g. mcp/custom-inspector\" class=\"h-8.5 font-mono text-xs\" />\n        </div>\n\n        <div class=\"space-y-1\">\n          <label class=\"text-foreground text-xs font-medium\">Package Scope or Organization</label>\n          <Input v-model=\"newServerScope\" placeholder=\"e.g. @org/mcp-server-custom\" class=\"h-8.5 font-mono text-xs\" />\n        </div>\n\n        <div class=\"space-y-1.5\">\n          <label class=\"text-foreground text-xs font-medium\">Transport Type</label>\n          <div class=\"grid grid-cols-2 gap-2\">\n            <button\n              type=\"button\"\n              :class=\"\n                cn(\n                  'flex items-center gap-2 rounded-lg border p-2.5 text-left text-xs transition-colors',\n                  newTransport === 'stdio'\n                    ? 'border-primary bg-primary/10 text-foreground font-semibold'\n                    : 'border-border bg-card text-muted-foreground hover:bg-muted',\n                )\n              \"\n              @click=\"newTransport = 'stdio'\"\n            >\n              <Terminal class=\"text-primary size-4 shrink-0\" />\n              <div>\n                <div class=\"text-foreground font-medium\">stdio Subprocess</div>\n                <div class=\"text-muted-foreground text-xs\">Local executable</div>\n              </div>\n            </button>\n\n            <button\n              type=\"button\"\n              :class=\"\n                cn(\n                  'flex items-center gap-2 rounded-lg border p-2.5 text-left text-xs transition-colors',\n                  newTransport === 'sse'\n                    ? 'border-primary bg-primary/10 text-foreground font-semibold'\n                    : 'border-border bg-card text-muted-foreground hover:bg-muted',\n                )\n              \"\n              @click=\"newTransport = 'sse'\"\n            >\n              <Radio class=\"text-info size-4 shrink-0\" />\n              <div>\n                <div class=\"text-foreground font-medium\">SSE HTTP Stream</div>\n                <div class=\"text-muted-foreground text-xs\">Remote gateway</div>\n              </div>\n            </button>\n          </div>\n        </div>\n\n        <div class=\"space-y-1\">\n          <label class=\"text-foreground text-xs font-medium\">\n            {{ newTransport === 'stdio' ? 'Command Line Entrypoint' : 'SSE Gateway URL' }}\n          </label>\n          <Input\n            v-model=\"newCommandOrUrl\"\n            :placeholder=\"\n              newTransport === 'stdio'\n                ? 'npx -y @org/mcp-server --config=prod'\n                : 'https://mcp.internal.company.com/sse/v1'\n            \"\n            class=\"h-8.5 font-mono text-xs\"\n          />\n        </div>\n\n        <div class=\"space-y-1\">\n          <label class=\"text-foreground text-xs font-medium\">Server Description</label>\n          <Input\n            v-model=\"newDescription\"\n            placeholder=\"Short summary of tools and capabilities provided by this server\"\n            class=\"h-8.5 text-xs\"\n          />\n        </div>\n      </div>\n\n      <DialogFooter class=\"gap-2 sm:gap-0\">\n        <DialogClose asChild>\n          <Button variant=\"outline\" class=\"h-8.5 text-xs\"> Cancel </Button>\n        </DialogClose>\n        <Button\n          class=\"h-8.5 text-xs\"\n          :disabled=\"!newServerName.trim() || !newCommandOrUrl.trim()\"\n          @click=\"handleAddServer\"\n        >\n          Register Server\n        </Button>\n      </DialogFooter>\n    </DialogContent>\n  </Dialog>\n</template>\n",
      "type": "registry:page",
      "target": "~/app/components/blocks/McpInstallServerDialog.vue"
    },
    {
      "path": "packages/registry-vue/blocks/mcp-server-registry-manager/McpKpiCards.vue",
      "content": "<script setup lang=\"ts\">\nimport { Activity, Boxes, Link2, Server, ShieldCheck, Wrench, Zap } from 'lucide-vue-next'\nimport { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'\n\ninterface Props {\n  serversCount: number\n  healthyCount: number\n  reconnectingCount: number\n  toolsCount: number\n  resourceTemplatesCount: number\n  invocationsToday: number\n}\n\ndefineProps<Props>()\n</script>\n\n<template>\n  <!-- 4 MCP System KPI Cards -->\n  <div class=\"grid grid-cols-1 gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n    <!-- KPI 1: Connected MCP Servers -->\n    <Card class=\"border-border bg-card shadow-xs\">\n      <CardHeader class=\"flex flex-row items-center justify-between pb-2\">\n        <CardTitle class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">\n          Connected Servers\n        </CardTitle>\n        <div class=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n          <Server class=\"size-3.5\" />\n        </div>\n      </CardHeader>\n      <CardContent class=\"space-y-1\">\n        <div class=\"text-2xl font-bold tracking-tight\">{{ serversCount }} Active Servers</div>\n        <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n          <span class=\"bg-success inline-block size-1.5 rounded-full\" />\n          <span>{{ healthyCount }} healthy</span>\n          <span>•</span>\n          <span class=\"text-warning\">{{ reconnectingCount }} reconnecting</span>\n        </div>\n      </CardContent>\n    </Card>\n\n    <!-- KPI 2: Registered Tools -->\n    <Card class=\"border-border bg-card shadow-xs\">\n      <CardHeader class=\"flex flex-row items-center justify-between pb-2\">\n        <CardTitle class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">\n          Registered Tools\n        </CardTitle>\n        <div class=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n          <Wrench class=\"size-3.5\" />\n        </div>\n      </CardHeader>\n      <CardContent class=\"space-y-1\">\n        <div class=\"text-2xl font-bold tracking-tight\">{{ toolsCount }} Tool Functions</div>\n        <div class=\"text-success flex items-center gap-1.5 text-xs\">\n          <ShieldCheck class=\"size-3.5\" />\n          <span>100% Schema Validated</span>\n        </div>\n      </CardContent>\n    </Card>\n\n    <!-- KPI 3: Resource Templates -->\n    <Card class=\"border-border bg-card shadow-xs\">\n      <CardHeader class=\"flex flex-row items-center justify-between pb-2\">\n        <CardTitle class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">\n          Resource Templates\n        </CardTitle>\n        <div class=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n          <Link2 class=\"size-3.5\" />\n        </div>\n      </CardHeader>\n      <CardContent class=\"space-y-1\">\n        <div class=\"text-2xl font-bold tracking-tight\">{{ resourceTemplatesCount }} Parameterized URIs</div>\n        <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n          <Boxes class=\"size-3.5\" />\n          <span>Dynamic URI Subscriptions</span>\n        </div>\n      </CardContent>\n    </Card>\n\n    <!-- KPI 4: Tool Invocation Volume -->\n    <Card class=\"border-border bg-card shadow-xs\">\n      <CardHeader class=\"flex flex-row items-center justify-between pb-2\">\n        <CardTitle class=\"text-muted-foreground text-xs font-medium tracking-wider uppercase\">\n          Invocation Volume\n        </CardTitle>\n        <div class=\"bg-primary/10 text-primary flex size-7 items-center justify-center rounded-md\">\n          <Zap class=\"size-3.5\" />\n        </div>\n      </CardHeader>\n      <CardContent class=\"space-y-1\">\n        <div class=\"text-2xl font-bold tracking-tight\">{{ invocationsToday.toLocaleString() }} calls today</div>\n        <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs\">\n          <Activity class=\"text-success size-3.5\" />\n          <span class=\"text-foreground font-medium\">99.8%</span> success · 142ms avg\n        </div>\n      </CardContent>\n    </Card>\n  </div>\n</template>\n",
      "type": "registry:page",
      "target": "~/app/components/blocks/McpKpiCards.vue"
    },
    {
      "path": "packages/registry-vue/blocks/mcp-server-registry-manager/McpServerCard.vue",
      "content": "<script setup lang=\"ts\">\nimport {\n  Braces,\n  Check,\n  Code2,\n  Copy,\n  FileCode,\n  Link2,\n  MoreHorizontal,\n  Radio,\n  RefreshCw,\n  Terminal,\n  Trash2,\n} from 'lucide-vue-next'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport {\n  DropdownMenu,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuTrigger,\n} from '@/components/ui/dropdown-menu'\nimport type { McpServer, ToolSchema } from './mcp-server-registry-types'\n\ninterface Props {\n  server: McpServer\n  copiedKey: string | null\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<{\n  openToolInspector: [tool: ToolSchema]\n  openServerInspector: []\n  restartServer: []\n  removeServer: []\n  copy: [text: string, key: string]\n}>()\n</script>\n\n<template>\n  <div\n    class=\"border-border bg-card hover:border-border/80 space-y-3.5 rounded-xl border p-4 shadow-xs transition-colors\"\n  >\n    <!-- Server Header Line -->\n    <div class=\"flex flex-col gap-2.5 sm:flex-row sm:items-center sm:justify-between\">\n      <div class=\"flex flex-wrap items-center gap-2.5\">\n        <div class=\"bg-muted text-foreground border-border flex size-8 items-center justify-center rounded-lg border\">\n          <Terminal v-if=\"server.transport === 'stdio'\" class=\"size-4\" />\n          <Radio v-else class=\"text-info size-4\" />\n        </div>\n        <div>\n          <div class=\"flex items-center gap-2\">\n            <span class=\"text-foreground font-mono text-sm font-semibold tracking-tight\">\n              {{ server.name }}\n            </span>\n            <Badge variant=\"secondary\" class=\"font-mono text-xs font-normal\">\n              {{ server.version }}\n            </Badge>\n            <Badge :variant=\"server.transport === 'stdio' ? 'outline' : 'secondary'\" class=\"gap-1 font-mono text-xs\">\n              <Terminal v-if=\"server.transport === 'stdio'\" class=\"size-3\" />\n              <Radio v-else class=\"text-info size-3\" />\n              {{ server.transport === 'stdio' ? 'stdio' : 'SSE stream' }}\n            </Badge>\n          </div>\n          <p class=\"text-muted-foreground mt-0.5 text-xs\">{{ server.scope }} · {{ server.description }}</p>\n        </div>\n      </div>\n\n      <!-- Status and Dropdown Actions -->\n      <div class=\"flex items-center gap-2 sm:self-center\">\n        <Badge\n          v-if=\"server.status === 'healthy'\"\n          variant=\"outline\"\n          class=\"border-success/40 bg-success/10 text-success gap-1.5 text-xs\"\n        >\n          <span class=\"bg-success size-1.5 rounded-full\" />\n          Connected & Healthy\n        </Badge>\n        <Badge v-else variant=\"outline\" class=\"border-warning/40 bg-warning/10 text-warning gap-1.5 text-xs\">\n          <span class=\"bg-warning size-1.5 rounded-full\" />\n          Reconnecting ({{ server.latencyMs }}ms)\n        </Badge>\n\n        <DropdownMenu>\n          <DropdownMenuTrigger asChild>\n            <Button variant=\"ghost\" size=\"icon\" class=\"size-8\">\n              <MoreHorizontal class=\"size-4\" />\n              <span class=\"sr-only\">Server Options</span>\n            </Button>\n          </DropdownMenuTrigger>\n          <DropdownMenuContent align=\"end\" class=\"w-48 text-xs\">\n            <DropdownMenuLabel>Server Actions</DropdownMenuLabel>\n            <DropdownMenuItem @click=\"emit('openServerInspector')\">\n              <FileCode class=\"mr-2 size-3.5\" />\n              Inspect Tool Schema\n            </DropdownMenuItem>\n            <DropdownMenuItem @click=\"emit('restartServer')\">\n              <RefreshCw class=\"mr-2 size-3.5\" />\n              Restart Process\n            </DropdownMenuItem>\n            <DropdownMenuItem @click=\"emit('copy', server.commandOrUrl, `cmd-${server.id}`)\">\n              <Copy class=\"mr-2 size-3.5\" />\n              {{ copiedKey === `cmd-${server.id}` ? 'Copied Command!' : 'Copy Command' }}\n            </DropdownMenuItem>\n            <DropdownMenuSeparator />\n            <DropdownMenuItem class=\"text-destructive focus:text-destructive\" @click=\"emit('removeServer')\">\n              <Trash2 class=\"mr-2 size-3.5\" />\n              Disconnect Server\n            </DropdownMenuItem>\n          </DropdownMenuContent>\n        </DropdownMenu>\n      </div>\n    </div>\n\n    <!-- Command or Endpoint snippet -->\n    <div\n      class=\"bg-muted/60 border-border flex items-center justify-between rounded-lg border px-3 py-2 font-mono text-xs\"\n    >\n      <div class=\"flex items-center gap-2 overflow-x-auto\">\n        <span class=\"text-muted-foreground select-none\">$</span>\n        <span class=\"text-foreground truncate\">{{ server.commandOrUrl }}</span>\n      </div>\n      <Button\n        aria-label=\"Copy server command\"\n        variant=\"ghost\"\n        size=\"icon\"\n        class=\"ml-2 size-6 shrink-0\"\n        @click=\"emit('copy', server.commandOrUrl, `cmd-btn-${server.id}`)\"\n      >\n        <Check v-if=\"copiedKey === `cmd-btn-${server.id}`\" class=\"text-success size-3\" />\n        <Copy v-else class=\"text-muted-foreground size-3\" />\n      </Button>\n    </div>\n\n    <!-- Resource Templates List -->\n    <div v-if=\"server.resourceTemplates.length > 0\" class=\"space-y-1.5\">\n      <div class=\"text-muted-foreground flex items-center gap-1.5 text-xs font-medium\">\n        <Link2 class=\"size-3\" />\n        <span>Resource URI Templates:</span>\n      </div>\n      <div class=\"flex flex-wrap items-center gap-1.5\">\n        <div\n          v-for=\"res in server.resourceTemplates\"\n          :key=\"res.uriTemplate\"\n          class=\"bg-muted/40 border-border text-foreground hover:bg-muted inline-flex items-center gap-1.5 rounded-md border px-2.5 py-1 font-mono text-xs transition-colors\"\n          :title=\"res.description\"\n        >\n          <span class=\"text-primary font-medium\">{{ res.uriTemplate }}</span>\n          <span class=\"text-muted-foreground font-sans text-xs\">({{ res.name }})</span>\n        </div>\n      </div>\n    </div>\n\n    <!-- Registered Tool Badges & Inspector Triggers -->\n    <div class=\"flex flex-col gap-2 pt-1 sm:flex-row sm:items-center sm:justify-between\">\n      <div class=\"flex flex-wrap items-center gap-1.5\">\n        <span class=\"text-muted-foreground mr-1 text-xs font-medium\"> Tools ({{ server.tools.length }}): </span>\n        <button\n          v-for=\"tool in server.tools\"\n          :key=\"tool.name\"\n          class=\"border-primary/30 bg-primary/5 hover:bg-primary/15 text-primary focus-visible:ring-ring inline-flex cursor-pointer items-center gap-1 rounded-md border px-2 py-1 font-mono text-xs font-medium transition-colors focus-visible:ring-2 focus-visible:outline-hidden\"\n          @click=\"emit('openToolInspector', tool)\"\n        >\n          <Code2 class=\"size-3\" />\n          <span>{{ tool.name }}</span>\n        </button>\n      </div>\n\n      <!-- Inspect Action Button -->\n      <div class=\"flex items-center gap-2\">\n        <span class=\"text-muted-foreground hidden text-xs lg:inline\">\n          {{ server.callsToday.toLocaleString() }} calls · {{ server.latencyMs }}ms ping\n        </span>\n        <Button variant=\"outline\" size=\"sm\" class=\"h-7.5 gap-1 text-xs\" @click=\"emit('openServerInspector')\">\n          <Braces class=\"size-3.5\" />\n          <span>Inspect Tool JSON Schema</span>\n        </Button>\n      </div>\n    </div>\n  </div>\n</template>\n",
      "type": "registry:page",
      "target": "~/app/components/blocks/McpServerCard.vue"
    },
    {
      "path": "packages/registry-vue/blocks/mcp-server-registry-manager/McpToolInspectorDrawer.vue",
      "content": "<script setup lang=\"ts\">\nimport { Check, Code2, Copy, Play, RefreshCw } from 'lucide-vue-next'\nimport { cn } from '@/lib/utils'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Separator } from '@/components/ui/separator'\nimport {\n  Sheet,\n  SheetClose,\n  SheetContent,\n  SheetDescription,\n  SheetFooter,\n  SheetHeader,\n  SheetTitle,\n} from '@/components/ui/sheet'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'\nimport type { McpServer, ToolSchema } from './mcp-server-registry-types'\n\ninterface Props {\n  open: boolean\n  server: McpServer\n  tool: ToolSchema\n  inspectorTab: 'request' | 'response' | 'schema'\n  copiedKey: string | null\n  isDryRunning: boolean\n  dryRunOutput: string | null\n}\n\nconst props = defineProps<Props>()\n\nconst emit = defineEmits<{\n  'update:open': [value: boolean]\n  'update:inspector-tab': [value: 'request' | 'response' | 'schema']\n  copy: [text: string, key: string]\n  runDryRun: []\n}>()\n\nfunction getToolSchemaDraft7(tool: ToolSchema) {\n  const properties: Record<string, any> = {}\n  const required: string[] = []\n\n  for (const p of tool.parameters) {\n    properties[p.name] = {\n      type: p.type,\n      description: p.description,\n    }\n    if (p.default !== undefined) properties[p.name].default = p.default\n    if (p.enum) properties[p.name].enum = p.enum\n    if (p.required) required.push(p.name)\n  }\n\n  return {\n    $schema: 'http://json-schema.org/draft-07/schema#',\n    type: 'object',\n    properties,\n    required,\n    additionalProperties: false,\n  }\n}\n\nfunction handleCopySchema() {\n  const tool = props.tool\n  if (!tool) return\n  const text =\n    props.inspectorTab === 'request'\n      ? JSON.stringify(tool.sampleRpcRequest, null, 2)\n      : props.inspectorTab === 'response'\n        ? JSON.stringify(tool.sampleRpcResponse, null, 2)\n        : JSON.stringify(getToolSchemaDraft7(tool), null, 2)\n  emit('copy', text, 'drawer-copied-schema')\n}\n</script>\n\n<template>\n  <Sheet :open=\"open\" @update:open=\"$emit('update:open', $event)\">\n    <SheetContent class=\"w-full space-y-6 overflow-y-auto p-6 sm:max-w-xl md:max-w-2xl\">\n      <SheetHeader class=\"space-y-2\">\n        <div class=\"flex flex-wrap items-center gap-2\">\n          <Badge variant=\"secondary\" class=\"font-mono text-xs font-medium\">\n            {{ server?.name }}\n          </Badge>\n          <Badge variant=\"outline\" class=\"font-mono text-xs\">\n            {{ server?.transport }}\n          </Badge>\n          <Badge class=\"bg-primary/10 text-primary border-primary/20 text-xs capitalize\" variant=\"outline\">\n            {{ tool?.category }}\n          </Badge>\n        </div>\n        <SheetTitle class=\"text-foreground flex items-center gap-2 font-mono text-lg font-bold tracking-tight\">\n          <Code2 class=\"text-primary size-5\" />\n          <span>{{ tool?.name }}</span>\n        </SheetTitle>\n        <SheetDescription class=\"text-muted-foreground text-xs leading-relaxed\">\n          {{ tool?.description }}\n        </SheetDescription>\n      </SheetHeader>\n\n      <Separator />\n\n      <!-- Parameters Specification Table -->\n      <div class=\"space-y-3\">\n        <div class=\"flex items-center justify-between\">\n          <h4 class=\"text-muted-foreground text-xs font-semibold tracking-wider uppercase\">\n            Parameter Schema ({{ tool?.parameters.length }})\n          </h4>\n          <span class=\"text-muted-foreground font-mono text-xs\">JSON-RPC 2.0 Method</span>\n        </div>\n\n        <div class=\"border-border overflow-hidden rounded-lg border\">\n          <div class=\"overflow-x-auto\">\n            <Table>\n              <TableHeader class=\"bg-muted/40\">\n                <TableRow class=\"hover:bg-transparent\">\n                  <TableHead class=\"text-xs font-semibold\">Parameter</TableHead>\n                  <TableHead class=\"text-xs font-semibold\">Type</TableHead>\n                  <TableHead class=\"text-xs font-semibold\">Required</TableHead>\n                  <TableHead class=\"text-xs font-semibold\">Description</TableHead>\n                </TableRow>\n              </TableHeader>\n              <TableBody>\n                <TableRow v-for=\"param in tool?.parameters\" :key=\"param.name\" class=\"text-xs\">\n                  <TableCell class=\"text-foreground font-mono font-medium\">\n                    {{ param.name }}\n                  </TableCell>\n                  <TableCell>\n                    <Badge variant=\"secondary\" class=\"font-mono text-xs\">\n                      {{ param.type }}\n                    </Badge>\n                  </TableCell>\n                  <TableCell>\n                    <Badge\n                      :variant=\"param.required ? 'default' : 'outline'\"\n                      :class=\"\n                        cn(\n                          'text-xs font-medium',\n                          param.required\n                            ? 'border-destructive/30 bg-destructive/10 text-destructive'\n                            : 'text-muted-foreground',\n                        )\n                      \"\n                    >\n                      {{ param.required ? 'Required' : 'Optional' }}\n                    </Badge>\n                  </TableCell>\n                  <TableCell class=\"text-muted-foreground\">\n                    <div>{{ param.description }}</div>\n                    <div v-if=\"param.default\" class=\"text-foreground/80 mt-0.5 font-mono text-xs\">\n                      default: <span class=\"text-primary\">{{ param.default }}</span>\n                    </div>\n                    <div v-if=\"param.enum\" class=\"text-foreground/80 mt-0.5 font-mono text-xs\">\n                      enum: [{{ param.enum.join(', ') }}]\n                    </div>\n                  </TableCell>\n                </TableRow>\n              </TableBody>\n            </Table>\n          </div>\n        </div>\n      </div>\n\n      <!-- Tabbed JSON-RPC Schema & Payloads -->\n      <div class=\"space-y-3\">\n        <Tabs\n          :model-value=\"inspectorTab\"\n          @update:model-value=\"$emit('update:inspector-tab', $event as 'request' | 'response' | 'schema')\"\n          class=\"w-full\"\n        >\n          <div class=\"mb-2 flex items-center justify-between\">\n            <TabsList class=\"h-8\">\n              <TabsTrigger value=\"request\" class=\"text-xs\">Sample Request</TabsTrigger>\n              <TabsTrigger value=\"response\" class=\"text-xs\">Sample Response</TabsTrigger>\n              <TabsTrigger value=\"schema\" class=\"text-xs\">Draft-07 Schema</TabsTrigger>\n            </TabsList>\n\n            <Button variant=\"ghost\" size=\"sm\" class=\"h-7 gap-1 text-xs\" @click=\"handleCopySchema\">\n              <Check v-if=\"copiedKey === 'drawer-copied-schema'\" class=\"text-success size-3\" />\n              <Copy v-else class=\"size-3\" />\n              {{ copiedKey === 'drawer-copied-schema' ? 'Copied!' : 'Copy Code' }}\n            </Button>\n          </div>\n\n          <!-- Tab 1: Request -->\n          <TabsContent value=\"request\" class=\"m-0\">\n            <pre\n              class=\"bg-muted/60 border-border text-foreground max-h-56 overflow-x-auto rounded-lg border p-3.5 font-mono text-xs leading-relaxed\"\n              >{{ JSON.stringify(tool?.sampleRpcRequest, null, 2) }}</pre\n            >\n          </TabsContent>\n\n          <!-- Tab 2: Response -->\n          <TabsContent value=\"response\" class=\"m-0\">\n            <pre\n              class=\"bg-muted/60 border-border text-foreground max-h-56 overflow-x-auto rounded-lg border p-3.5 font-mono text-xs leading-relaxed\"\n              >{{ JSON.stringify(tool?.sampleRpcResponse, null, 2) }}</pre\n            >\n          </TabsContent>\n\n          <!-- Tab 3: Draft-07 Schema -->\n          <TabsContent value=\"schema\" class=\"m-0\">\n            <pre\n              class=\"bg-muted/60 border-border text-foreground max-h-56 overflow-x-auto rounded-lg border p-3.5 font-mono text-xs leading-relaxed\"\n              >{{ JSON.stringify(getToolSchemaDraft7(tool), null, 2) }}</pre\n            >\n          </TabsContent>\n        </Tabs>\n      </div>\n\n      <!-- Dry Run Simulator -->\n      <div class=\"border-border bg-muted/20 space-y-3 rounded-lg border p-3.5\">\n        <div class=\"flex items-center justify-between\">\n          <span class=\"text-foreground flex items-center gap-1.5 text-xs font-semibold\">\n            <Play class=\"text-primary size-3.5\" />\n            Simulate Tool Invocation\n          </span>\n          <Button size=\"sm\" class=\"h-7.5 gap-1 text-xs\" :disabled=\"isDryRunning\" @click=\"$emit('runDryRun')\">\n            <RefreshCw :class=\"cn('size-3', isDryRunning && 'animate-spin')\" />\n            {{ isDryRunning ? 'Invoking RPC...' : 'Test Dry-Run Call' }}\n          </Button>\n        </div>\n\n        <div v-if=\"dryRunOutput\" class=\"space-y-1\">\n          <span class=\"text-success font-mono text-xs\"> ✓ Invocation 200 OK (32ms): </span>\n          <pre\n            class=\"bg-muted/80 border-border text-foreground max-h-36 overflow-x-auto rounded border p-2.5 font-mono text-xs leading-tight\"\n            >{{ dryRunOutput }}</pre\n          >\n        </div>\n      </div>\n\n      <SheetFooter class=\"pt-2\">\n        <SheetClose asChild>\n          <Button variant=\"outline\" class=\"h-8.5 w-full text-xs sm:w-auto\"> Close Inspector </Button>\n        </SheetClose>\n      </SheetFooter>\n    </SheetContent>\n  </Sheet>\n</template>\n",
      "type": "registry:page",
      "target": "~/app/components/blocks/McpToolInspectorDrawer.vue"
    },
    {
      "path": "packages/registry-vue/blocks/mcp-server-registry-manager/mcp-server-registry-data.ts",
      "content": "import type { McpServer } from './mcp-server-registry-types'\n\nexport const defaultServers: McpServer[] = [\n  {\n    id: 'server-ctx-1',\n    name: 'mcp/context7-docs',\n    scope: '@context7/mcp-server',\n    version: 'v1.4.2',\n    transport: 'stdio',\n    commandOrUrl: 'npx -y @context7/mcp-server',\n    status: 'healthy',\n    uptime: '99.98%',\n    latencyMs: 18,\n    callsToday: 4120,\n    description: 'Context-aware documentation retriever and code snippet indexer for public libraries and frameworks.',\n    envVars: ['CONTEXT7_API_KEY=c7_live_***', 'CACHE_TTL=3600'],\n    resourceTemplates: [\n      {\n        uriTemplate: 'docs://{library}/{version}',\n        name: 'Library Documentation AST',\n        description: 'Direct access to indexed AST documentation, type exports, and code snippets',\n        mimeType: 'application/json',\n      },\n      {\n        uriTemplate: 'cheatsheets://{framework}/api-reference',\n        name: 'Framework Cheatsheet',\n        description: 'High-density API method cheat sheets and migration summaries',\n        mimeType: 'text/markdown',\n      },\n    ],\n    tools: [\n      {\n        name: 'query_docs',\n        displayName: 'Query Library Docs',\n        description:\n          'Retrieves up-to-date documentation and code examples from Context7 for any programming library or framework.',\n        category: 'documentation',\n        parameters: [\n          {\n            name: 'libraryId',\n            type: 'string',\n            required: true,\n            description: 'Exact Context7-compatible library ID (e.g. /tailwindlabs/tailwindcss or /unovue/reka-ui).',\n          },\n          {\n            name: 'query',\n            type: 'string',\n            required: true,\n            description: 'What to look up in the library documentation, scoped to a single concept.',\n          },\n          {\n            name: 'limit',\n            type: 'number',\n            required: false,\n            default: '5',\n            description: 'Maximum number of relevant code snippets to return (1-20).',\n          },\n          {\n            name: 'includeSnippets',\n            type: 'boolean',\n            required: false,\n            default: 'true',\n            description: 'Whether to include verified code snippet examples in markdown format.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-ctx-001',\n          method: 'tools/call',\n          params: {\n            name: 'query_docs',\n            arguments: {\n              libraryId: '/tailwindlabs/tailwindcss',\n              query: 'CSS variables and OKLCH color palettes v4',\n              limit: 3,\n              includeSnippets: true,\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-ctx-001',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: 'Tailwind CSS v4 introduces native CSS-first theme configuration using `@theme` and OKLCH color functions without javascript config files.',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'resolve_library_id',\n        displayName: 'Resolve Library ID',\n        description:\n          'Resolves a package or product name to a Context7-compatible library ID and returns matching ranked libraries.',\n        category: 'documentation',\n        parameters: [\n          {\n            name: 'libraryName',\n            type: 'string',\n            required: true,\n            description: 'Library name to search for (e.g. Next.js, Reka UI, Lucide).',\n          },\n          {\n            name: 'ecosystem',\n            type: 'string',\n            required: false,\n            default: 'npm',\n            enum: ['npm', 'pypi', 'crates', 'go', 'gem'],\n            description: 'Package registry ecosystem to prioritize during identifier resolution.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-ctx-002',\n          method: 'tools/call',\n          params: {\n            name: 'resolve_library_id',\n            arguments: {\n              libraryName: 'reka-ui',\n              ecosystem: 'npm',\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-ctx-002',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"libraryId\":\"/unovue/reka-ui\",\"name\":\"Reka UI\",\"description\":\"Headless UI primitives for Vue 3.5\",\"reputation\":\"High\",\"benchmarkScore\":99}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n    ],\n  },\n  {\n    id: 'server-pg-2',\n    name: 'mcp/postgres-inspector',\n    scope: '@modelcontextprotocol/server-postgres',\n    version: 'v0.9.1',\n    transport: 'stdio',\n    commandOrUrl: 'npx -y @modelcontextprotocol/server-postgres postgresql://app_user:***@db.internal:5432/prod_main',\n    status: 'healthy',\n    uptime: '99.95%',\n    latencyMs: 24,\n    callsToday: 3450,\n    description:\n      'Direct PostgreSQL read-only query execution, EXPLAIN execution plan inspector, and live schema reflection.',\n    envVars: ['PGSSLMODE=require', 'MAX_CONNECTIONS=10'],\n    resourceTemplates: [\n      {\n        uriTemplate: 'postgres://{schema}/{table}',\n        name: 'Table Schema Definition',\n        description: 'PostgreSQL table column constraints, foreign keys, row count estimations, and B-Tree indexes',\n        mimeType: 'application/json',\n      },\n      {\n        uriTemplate: 'postgres://metrics/slow-queries',\n        name: 'PgStatStatements Log Buffer',\n        description: 'Aggregated query execution statistics and cache hit ratios',\n        mimeType: 'application/json',\n      },\n    ],\n    tools: [\n      {\n        name: 'execute_sql',\n        displayName: 'Execute Read-Only SQL',\n        description:\n          'Executes read-only SQL queries against Postgres connection with safe execution timeout safeguards.',\n        category: 'database',\n        parameters: [\n          {\n            name: 'query',\n            type: 'string',\n            required: true,\n            description: 'SQL statement (SELECT only) to execute on the cluster.',\n          },\n          {\n            name: 'readOnly',\n            type: 'boolean',\n            required: false,\n            default: 'true',\n            description: 'Enforces transaction read-only flag before executing SQL.',\n          },\n          {\n            name: 'timeoutMs',\n            type: 'number',\n            required: false,\n            default: '5000',\n            description: 'Statement cancellation timeout in milliseconds.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-pg-001',\n          method: 'tools/call',\n          params: {\n            name: 'execute_sql',\n            arguments: {\n              query: 'SELECT id, email, role, created_at FROM public.users WHERE is_active = true LIMIT 5;',\n              readOnly: true,\n              timeoutMs: 5000,\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-pg-001',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"rows\":[{\"id\":\"usr_8492\",\"email\":\"alex@example.com\",\"role\":\"admin\",\"created_at\":\"2026-02-14T08:30:00Z\"}],\"rowCount\":1,\"durationMs\":14.2}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'explain_query',\n        displayName: 'Explain Query Plan',\n        description: 'Runs EXPLAIN ANALYZE on query plans to detect slow sequential scans and missing indexes.',\n        category: 'database',\n        parameters: [\n          {\n            name: 'query',\n            type: 'string',\n            required: true,\n            description: 'SQL query to analyze execution graph and node timings.',\n          },\n          {\n            name: 'analyze',\n            type: 'boolean',\n            required: false,\n            default: 'true',\n            description: 'Execute statement to measure actual wall-clock row counts and buffer usage.',\n          },\n          {\n            name: 'format',\n            type: 'string',\n            required: false,\n            default: 'json',\n            enum: ['json', 'text', 'yaml'],\n            description: 'Postgres execution plan output serialization format.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-pg-002',\n          method: 'tools/call',\n          params: {\n            name: 'explain_query',\n            arguments: {\n              query: 'SELECT * FROM orders WHERE user_id = $1 ORDER BY created_at DESC;',\n              analyze: true,\n              format: 'json',\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-pg-002',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"Plan\":{\"Node Type\":\"Index Scan\",\"Index Name\":\"idx_orders_user_id\",\"Startup Cost\":0.42,\"Total Cost\":8.44,\"Plan Rows\":1,\"Actual Rows\":1,\"Actual Total Time\":0.114}}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'inspect_schema',\n        displayName: 'Inspect Schema Meta',\n        description: 'Returns table column definitions, constraints, foreign keys, and indexes for a database schema.',\n        category: 'database',\n        parameters: [\n          {\n            name: 'schema',\n            type: 'string',\n            required: false,\n            default: 'public',\n            description: 'Target namespace schema name (e.g. public, auth, billing).',\n          },\n          {\n            name: 'includeForeignKeys',\n            type: 'boolean',\n            required: false,\n            default: 'true',\n            description: 'Include relation cardinality graphs and ON DELETE cascade actions.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-pg-003',\n          method: 'tools/call',\n          params: {\n            name: 'inspect_schema',\n            arguments: {\n              schema: 'public',\n              includeForeignKeys: true,\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-pg-003',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"schema\":\"public\",\"tablesCount\":18,\"tables\":[\"users\",\"teams\",\"orders\",\"invoices\",\"audit_logs\"]}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n    ],\n  },\n  {\n    id: 'server-gh-3',\n    name: 'mcp/github-tools',\n    scope: '@modelcontextprotocol/server-github',\n    version: 'v2.1.0',\n    transport: 'stdio',\n    commandOrUrl: 'npx -y @modelcontextprotocol/server-github',\n    status: 'healthy',\n    uptime: '99.91%',\n    latencyMs: 92,\n    callsToday: 2890,\n    description:\n      'GitHub REST & GraphQL API bindings for pull request management, diff inspection, and GitHub Actions CI triggers.',\n    envVars: ['GITHUB_PERSONAL_ACCESS_TOKEN=ghp_live_***'],\n    resourceTemplates: [\n      {\n        uriTemplate: 'github://repos/{owner}/{repo}/pulls/{number}',\n        name: 'Pull Request Snapshot',\n        description: 'Structured pull request metadata, commits, CI checks, and review discussions',\n        mimeType: 'application/json',\n      },\n      {\n        uriTemplate: 'github://repos/{owner}/{repo}/actions/{runId}',\n        name: 'CI Workflow Run Logs',\n        description: 'GitHub Actions build step outputs and failure diagnostics',\n        mimeType: 'text/plain',\n      },\n    ],\n    tools: [\n      {\n        name: 'create_pr',\n        displayName: 'Create Pull Request',\n        description: 'Creates a GitHub pull request with title, description, branch target, and reviewer tags.',\n        category: 'version-control',\n        parameters: [\n          { name: 'owner', type: 'string', required: true, description: 'GitHub account or organization name.' },\n          { name: 'repo', type: 'string', required: true, description: 'Repository name.' },\n          { name: 'title', type: 'string', required: true, description: 'Pull request header title.' },\n          { name: 'head', type: 'string', required: true, description: 'Source branch containing commits.' },\n          { name: 'base', type: 'string', required: true, description: 'Target branch (e.g. main).' },\n          { name: 'draft', type: 'boolean', required: false, default: 'false', description: 'Create in draft mode.' },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-gh-001',\n          method: 'tools/call',\n          params: {\n            name: 'create_pr',\n            arguments: {\n              owner: 'uday-a',\n              repo: 'uipkge',\n              title: 'feat(mcp): add mcp-server-registry-manager block',\n              head: 'feat/mcp-manager',\n              base: 'main',\n              draft: false,\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-gh-001',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"number\":142,\"url\":\"https://github.com/uday-a/uipkge/pull/142\",\"status\":\"open\",\"mergeable\":true}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'review_diff',\n        displayName: 'Review Diff',\n        description: 'Fetches and analyzes pull request unified diffs against target base branch.',\n        category: 'version-control',\n        parameters: [\n          { name: 'owner', type: 'string', required: true, description: 'Repository owner.' },\n          { name: 'repo', type: 'string', required: true, description: 'Repository name.' },\n          { name: 'pullNumber', type: 'number', required: true, description: 'GitHub pull request number.' },\n          {\n            name: 'contextLines',\n            type: 'number',\n            required: false,\n            default: '3',\n            description: 'Number of surrounding context lines to include.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-gh-002',\n          method: 'tools/call',\n          params: {\n            name: 'review_diff',\n            arguments: {\n              owner: 'uday-a',\n              repo: 'uipkge',\n              pullNumber: 142,\n              contextLines: 3,\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-gh-002',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: 'diff --git a/components/blocks/McpServerRegistryManager.vue b/components/blocks/McpServerRegistryManager.vue\\n+<template>\\n+  <div data-slot=\"mcp-server-registry-manager\">...</div>\\n+</template>',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'merge_pr',\n        displayName: 'Merge Pull Request',\n        description: 'Performs squash-merge or merge commit with branch auto-deletion.',\n        category: 'version-control',\n        parameters: [\n          { name: 'owner', type: 'string', required: true, description: 'Repository owner.' },\n          { name: 'repo', type: 'string', required: true, description: 'Repository name.' },\n          { name: 'pullNumber', type: 'number', required: true, description: 'Pull request number.' },\n          {\n            name: 'mergeMethod',\n            type: 'string',\n            required: false,\n            default: 'squash',\n            enum: ['squash', 'merge', 'rebase'],\n            description: 'Git merge strategy to apply.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-gh-003',\n          method: 'tools/call',\n          params: {\n            name: 'merge_pr',\n            arguments: {\n              owner: 'uday-a',\n              repo: 'uipkge',\n              pullNumber: 142,\n              mergeMethod: 'squash',\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-gh-003',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"sha\":\"8a7c2b3d...\",\"merged\":true,\"message\":\"Pull Request successfully merged and closed\"}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'get_workflow_runs',\n        displayName: 'Get Workflow Runs',\n        description: 'Lists GitHub Actions CI workflow run statuses and failure logs.',\n        category: 'version-control',\n        parameters: [\n          { name: 'owner', type: 'string', required: true, description: 'Repository owner.' },\n          { name: 'repo', type: 'string', required: true, description: 'Repository name.' },\n          {\n            name: 'status',\n            type: 'string',\n            required: false,\n            default: 'completed',\n            enum: ['completed', 'in_progress', 'queued', 'failure'],\n            description: 'Filter CI runs by lifecycle status.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-gh-004',\n          method: 'tools/call',\n          params: {\n            name: 'get_workflow_runs',\n            arguments: {\n              owner: 'uday-a',\n              repo: 'uipkge',\n              status: 'completed',\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-gh-004',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"total_count\":24,\"workflow_runs\":[{\"id\":9812401,\"name\":\"CI Registry Build\",\"conclusion\":\"success\"}]}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n    ],\n  },\n  {\n    id: 'server-cf-4',\n    name: 'mcp/cloudflare-deployer',\n    scope: '@cloudflare/mcp-pages-worker',\n    version: 'v3.0.4',\n    transport: 'sse',\n    commandOrUrl: 'https://mcp-gateway.cloudflare.com/sse/v1/uipkge-prod',\n    status: 'healthy',\n    uptime: '100.0%',\n    latencyMs: 48,\n    callsToday: 1180,\n    description:\n      'Edge runtime deployment automation, real-time Cloudflare Worker telemetry log tailing, and CDN cache invalidation.',\n    envVars: ['CLOUDFLARE_API_TOKEN=cft_live_***', 'CLOUDFLARE_ACCOUNT_ID=8bb9e07a...'],\n    resourceTemplates: [\n      {\n        uriTemplate: 'cloudflare://zones/{zoneId}/pages',\n        name: 'Pages Deployment Manifest',\n        description: 'Active production and preview deployment bundles with rollback pointers',\n        mimeType: 'application/json',\n      },\n      {\n        uriTemplate: 'cloudflare://workers/{scriptName}/tail',\n        name: 'Live Worker Telemetry Stream',\n        description: 'Real-time structured event logs, CPU execution times, and exceptions',\n        mimeType: 'application/x-ndjson',\n      },\n    ],\n    tools: [\n      {\n        name: 'deploy_pages',\n        displayName: 'Deploy Cloudflare Pages',\n        description: 'Triggers atomic Cloudflare Pages deployment bundle upload with verification.',\n        category: 'deployment',\n        parameters: [\n          {\n            name: 'projectName',\n            type: 'string',\n            required: true,\n            description: 'Cloudflare Pages project name (uipkge).',\n          },\n          { name: 'branch', type: 'string', required: true, description: 'Git branch trigger (e.g. main).' },\n          { name: 'commitHash', type: 'string', required: true, description: 'Target 40-char Git commit hash.' },\n          {\n            name: 'environment',\n            type: 'string',\n            required: false,\n            default: 'production',\n            enum: ['production', 'preview'],\n            description: 'Deployment target stage.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-cf-001',\n          method: 'tools/call',\n          params: {\n            name: 'deploy_pages',\n            arguments: {\n              projectName: 'uipkge',\n              branch: 'main',\n              commitHash: '7c8b91a24d0e932b12f4567890abcdef12345678',\n              environment: 'production',\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-cf-001',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"deploymentId\":\"dep_9801a\",\"url\":\"https://uipkge.dev\",\"status\":\"active\",\"buildDurationSec\":14}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'purge_cache',\n        displayName: 'Purge CDN Cache',\n        description: 'Purges Cloudflare CDN cache zones by URL pattern or Cache-Tag headers.',\n        category: 'deployment',\n        parameters: [\n          { name: 'zoneId', type: 'string', required: true, description: 'Cloudflare Zone identifier.' },\n          {\n            name: 'purgeEverything',\n            type: 'boolean',\n            required: false,\n            default: 'false',\n            description: 'Purge entire CDN edge cache.',\n          },\n          { name: 'tags', type: 'array', required: false, description: 'Array of Cache-Tag headers to invalidate.' },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-cf-002',\n          method: 'tools/call',\n          params: {\n            name: 'purge_cache',\n            arguments: {\n              zoneId: 'zn_uipkge_core_912',\n              purgeEverything: false,\n              tags: ['registry-json', 'llms-txt'],\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-cf-002',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"success\":true,\"purgedTags\":[\"registry-json\",\"llms-txt\"],\"timestamp\":\"2026-08-21T10:45:00Z\"}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'tail_worker_logs',\n        displayName: 'Tail Worker Logs',\n        description: 'Subscribes to real-time Cloudflare Worker telemetry logs and exception traces.',\n        category: 'deployment',\n        parameters: [\n          { name: 'scriptName', type: 'string', required: true, description: 'Worker script identifier.' },\n          {\n            name: 'samplingRate',\n            type: 'number',\n            required: false,\n            default: '1.0',\n            description: 'Trace event sampling ratio (0.1 to 1.0).',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-cf-003',\n          method: 'tools/call',\n          params: {\n            name: 'tail_worker_logs',\n            arguments: {\n              scriptName: 'uipkge-registry-proxy',\n              samplingRate: 1.0,\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-cf-003',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"sessionId\":\"tail_sess_904\",\"status\":\"streaming\",\"eventsProcessed\":480}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n    ],\n  },\n  {\n    id: 'server-bv-5',\n    name: 'mcp/brave-search',\n    scope: '@modelcontextprotocol/server-brave-search',\n    version: 'v1.1.2',\n    transport: 'sse',\n    commandOrUrl: 'https://mcp-stream.brave.internal/sse?channel=research',\n    status: 'reconnecting',\n    uptime: '98.40%',\n    latencyMs: 165,\n    callsToday: 840,\n    description: 'Privacy-preserving web search, index lookup, and clean markdown extraction from live URLs.',\n    envVars: ['BRAVE_API_KEY=bsa_live_***', 'RATE_LIMIT_RPS=20'],\n    resourceTemplates: [\n      {\n        uriTemplate: 'search://web/{query}',\n        name: 'Real-Time Web Search Cache',\n        description: 'Cached organic search result nodes with domain trust rankings',\n        mimeType: 'application/json',\n      },\n      {\n        uriTemplate: 'webpage://cached/{urlHash}',\n        name: 'Normalized Page Mirror',\n        description: 'Clean reader-mode markdown representation of fetched webpage',\n        mimeType: 'text/markdown',\n      },\n    ],\n    tools: [\n      {\n        name: 'brave_search',\n        displayName: 'Brave Web Search',\n        description: 'Queries Brave Search API for web results, snippets, publishing dates, and ranking scores.',\n        category: 'web-search',\n        parameters: [\n          { name: 'query', type: 'string', required: true, description: 'Search term or technical keyword.' },\n          {\n            name: 'count',\n            type: 'number',\n            required: false,\n            default: '10',\n            description: 'Number of organic results (1-20).',\n          },\n          {\n            name: 'freshness',\n            type: 'string',\n            required: false,\n            enum: ['pd', 'pw', 'pm', 'py'],\n            description: 'Filter by time horizon: past day, week, month, or year.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-bv-001',\n          method: 'tools/call',\n          params: {\n            name: 'brave_search',\n            arguments: {\n              query: 'Reka UI Vue 3.5 release notes',\n              count: 5,\n              freshness: 'pm',\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-bv-001',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"results\":[{\"title\":\"Reka UI v1.4 Documentation\",\"url\":\"https://reka-ui.com\",\"snippet\":\"Radix-vue is now Reka UI with Vue 3.5 TypeScript improvements.\"}]}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'fetch_web_content',\n        displayName: 'Fetch Web Content',\n        description: 'Fetches full clean markdown representations from verified web URLs.',\n        category: 'web-search',\n        parameters: [\n          { name: 'url', type: 'string', required: true, description: 'Fully qualified HTTP/HTTPS URL to crawl.' },\n          {\n            name: 'format',\n            type: 'string',\n            required: false,\n            default: 'markdown',\n            enum: ['markdown', 'text', 'html'],\n            description: 'Target format of extracted webpage body content.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-bv-002',\n          method: 'tools/call',\n          params: {\n            name: 'fetch_web_content',\n            arguments: {\n              url: 'https://modelcontextprotocol.io/introduction',\n              format: 'markdown',\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-bv-002',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '# Model Context Protocol\\n\\nMCP is an open standard that enables developers to build secure, two-way connections between their data sources and AI-powered tools.',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n    ],\n  },\n  {\n    id: 'server-sn-6',\n    name: 'mcp/sentry-telemetry',\n    scope: '@sentry/mcp-telemetry',\n    version: 'v1.8.0',\n    transport: 'stdio',\n    commandOrUrl: 'npx -y @sentry/mcp-telemetry --org=uipkge',\n    status: 'healthy',\n    uptime: '99.99%',\n    latencyMs: 35,\n    callsToday: 820,\n    description:\n      'Production crash monitoring, unhandled exceptions triage, and stacktrace source-mapping for AI agents.',\n    envVars: ['SENTRY_AUTH_TOKEN=sntrys_live_***', 'SENTRY_ORG=uipkge'],\n    resourceTemplates: [\n      {\n        uriTemplate: 'sentry://projects/{project}/issues/{issueId}',\n        name: 'Sentry Issue Context',\n        description: 'Resolved source maps, breadcrumbs trail, device context, and user impact rate',\n        mimeType: 'application/json',\n      },\n      {\n        uriTemplate: 'sentry://projects/{project}/stats/24h',\n        name: 'Hourly Error Volume',\n        description: 'Aggregated error frequency histograms across release versions',\n        mimeType: 'application/json',\n      },\n    ],\n    tools: [\n      {\n        name: 'query_sentry_issues',\n        displayName: 'Query Sentry Issues',\n        description: 'Lists unhandled exceptions and regression issues by release tag and frequency.',\n        category: 'observability',\n        parameters: [\n          { name: 'project', type: 'string', required: true, description: 'Sentry project slug.' },\n          { name: 'query', type: 'string', required: false, description: 'Sentry search query (e.g. is:unresolved).' },\n          {\n            name: 'statsPeriod',\n            type: 'string',\n            required: false,\n            default: '24h',\n            enum: ['24h', '14d', '30d'],\n            description: 'Time window for issue occurrence statistics.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-sn-001',\n          method: 'tools/call',\n          params: {\n            name: 'query_sentry_issues',\n            arguments: {\n              project: 'uipkge-astro-site',\n              query: 'is:unresolved level:error',\n              statsPeriod: '24h',\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-sn-001',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"issues\":[{\"id\":\"iss_991\",\"title\":\"TypeError: Cannot read properties of undefined (reading \\'dataset\\')\",\"count\":3,\"lastSeen\":\"2026-08-21T09:12:00Z\"}]}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n      {\n        name: 'get_issue_stacktrace',\n        displayName: 'Get De-minified Stacktrace',\n        description: 'Retrieves de-minified source code stacktrace and breadcrumb chain for an error ID.',\n        category: 'observability',\n        parameters: [\n          { name: 'issueId', type: 'string', required: true, description: 'Unique Sentry issue identifier.' },\n          {\n            name: 'expandContext',\n            type: 'boolean',\n            required: false,\n            default: 'true',\n            description: 'Include 5 lines of source code surrounding the crashing line.',\n          },\n        ],\n        sampleRpcRequest: {\n          jsonrpc: '2.0',\n          id: 'req-sn-002',\n          method: 'tools/call',\n          params: {\n            name: 'get_issue_stacktrace',\n            arguments: {\n              issueId: 'iss_991',\n              expandContext: true,\n            },\n          },\n        },\n        sampleRpcResponse: {\n          jsonrpc: '2.0',\n          id: 'req-sn-002',\n          result: {\n            content: [\n              {\n                type: 'text',\n                text: '{\"filename\":\"src/components/story/Story.vue\",\"lineno\":42,\"colno\":14,\"function\":\"handleCopy\",\"contextLine\":\"navigator.clipboard.writeText(props.code)\"}',\n              },\n            ],\n            isError: false,\n          },\n        },\n      },\n    ],\n  },\n]\n",
      "type": "registry:page",
      "target": "~/app/components/blocks/mcp-server-registry-data.ts"
    },
    {
      "path": "packages/registry-vue/blocks/mcp-server-registry-manager/mcp-server-registry-types.ts",
      "content": "export type TransportType = 'stdio' | 'sse'\nexport type ServerStatus = 'healthy' | 'reconnecting' | 'degraded'\n\nexport interface ToolParam {\n  name: string\n  type: 'string' | 'number' | 'boolean' | 'object' | 'array'\n  required: boolean\n  description: string\n  default?: string\n  enum?: string[]\n}\n\nexport interface ToolSchema {\n  name: string\n  displayName: string\n  description: string\n  category: 'documentation' | 'database' | 'version-control' | 'deployment' | 'web-search' | 'observability'\n  parameters: ToolParam[]\n  sampleRpcRequest: {\n    jsonrpc: '2.0'\n    id: string\n    method: 'tools/call'\n    params: {\n      name: string\n      arguments: Record<string, any>\n    }\n  }\n  sampleRpcResponse: {\n    jsonrpc: '2.0'\n    id: string\n    result: {\n      content: Array<{\n        type: 'text' | 'resource' | 'image'\n        text?: string\n        resource?: any\n      }>\n      isError: boolean\n    }\n  }\n}\n\nexport interface ResourceTemplate {\n  uriTemplate: string\n  name: string\n  description: string\n  mimeType: string\n}\n\nexport interface McpServer {\n  id: string\n  name: string\n  scope: string\n  version: string\n  transport: TransportType\n  commandOrUrl: string\n  status: ServerStatus\n  uptime: string\n  latencyMs: number\n  callsToday: number\n  description: string\n  envVars: string[]\n  resourceTemplates: ResourceTemplate[]\n  tools: ToolSchema[]\n}\n",
      "type": "registry:page",
      "target": "~/app/components/blocks/mcp-server-registry-types.ts"
    }
  ],
  "dependencies": [
    "lucide-vue-next"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/vue/badge.json",
    "https://uipkge.dev/r/vue/button.json",
    "https://uipkge.dev/r/vue/card.json",
    "https://uipkge.dev/r/vue/dialog.json",
    "https://uipkge.dev/r/vue/dropdown-menu.json",
    "https://uipkge.dev/r/vue/input.json",
    "https://uipkge.dev/r/vue/separator.json",
    "https://uipkge.dev/r/vue/sheet.json",
    "https://uipkge.dev/r/vue/table.json",
    "https://uipkge.dev/r/vue/tabs.json"
  ],
  "description": "Anthropic Model Context Protocol (MCP) server registry manager with connection health monitoring, stdio/SSE stream transport metrics, live tool schema explorer, parameterized resource URI templates, and JSON-RPC 2.0 payload inspection drawer.",
  "categories": [
    "ai",
    "app",
    "devops",
    "dashboard"
  ]
}