my-mcp-app
Provides tools for managing a Shopify store, including analytics, SEO/GEO optimization, product updates, discount creation, and identifying stagnant inventory via the Shopify Admin and Storefront APIs.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@my-mcp-apprun the hello world tool"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Unhide
Em um e-commerce, muita receita não está perdida — ela só está escondida.
Unhide é um agente de inteligência e ação para operações de e-commerce, entregue como um MCP App: um servidor MCP (Model Context Protocol) que expõe ferramentas sobre uma loja Shopify e um dashboard interativo que roda dentro do host MCP (deco, Claude, etc.).
Índice
Related MCP server: TypeScript MCP Server Boilerplate
Contexto do projeto
Quem opera um e-commerce de alto volume sabe que a loja perde dinheiro em dezenas de pontos todos os dias:
um produto recebe muita intenção de compra, mas não converte;
outro está há semanas parado no estoque, com capital imobilizado;
uma mudança de demanda começa a acontecer e a operação só percebe depois;
centenas ou milhares de produtos poderiam ser melhor encontrados — por pessoas e, agora, também por agentes de IA.
O problema não é falta de dado. Os dados já existem na plataforma — só estão espalhados entre catálogo, tráfego, estoque, pedidos, busca interna e comportamento do consumidor. Encontrar essas oportunidades, decidir o que fazer e executar manualmente é trabalho de uma equipe inteira em tempo integral.
O Unhide observa os sinais da operação, encontra as oportunidades escondidas e transforma oportunidade em ação:
cruza intenção × conversão × margem/markup para achar o menor incentivo necessário para vender mais sem sacrificar rentabilidade — a pergunta deixa de ser "quanto desconto eu dou?";
na frente de estoque, procura a interseção entre capital parado e demanda real — não apenas a lista de produtos com mais estoque;
audita e transforma a loja para descoberta em SEO e GEO, deixando catálogo e produtos estruturados para os consumidores de hoje e para os agentes que vão descobrir, recomendar e comprar amanhã;
e centraliza tudo em uma visão 360 que serve de camada de contexto para o próprio agente — é dali que ele entende o que está acontecendo, quais sinais merecem atenção e onde existe uma oportunidade que vira ação.
A diferença: de um lado, visão profunda do negócio; do outro, um agente capaz de conversar com esses dados, cruzá-los e agir sobre eles. Não é mais um dashboard dizendo o que aconteceu.
O que o Unhide entrega
O dashboard é organizado em quatro abas — as mesmas quatro frentes do produto.
🩺 Diagnóstico
Visão geral da operação em um só lugar: sessões, visitantes, tráfego por origem, comportamento e funil (bounce, adição ao carrinho, checkout iniciado × concluído), busca interna (incluindo buscas sem resultado, o sinal mais claro de lacuna de catálogo), intenção de compra por fonte e a quebra de conversão por produto, tipo, coleção, canal ou cliente novo × recorrente.
Inclui ainda o painel de descontos gerados por IA: a receita atribuída às promoções que o próprio agente criou — ou seja, dá para metrificar claramente o ganho do agente, não só o que ele fez.
🔎 SEO
Relatório com nota 0–100 por produto, calculada a partir de título de página, meta description, handle da URL, descrição e imagem — com os pontos concretos de melhoria de cada um. Dá para editar o SEO manualmente ou pedir para a IA preencher automaticamente, usando o contexto da loja e do catálogo, e publicar direto na Shopify.
🤖 GEO (Generative Engine Optimization)
A aba que prepara a loja para o futuro da descoberta. Avalia o quanto cada produto está pronto
para ser citado e recomendado pelas IAs de busca, com base no metafield geo_data (descrição
longa, marca, MPN, material, cor, público-alvo, tabela de especificações, FAQ e destaques). Também
tem geração assistida por IA, com publicação automática na loja — deixando o catálogo pronto
para indexação por robôs, LLMs e protocolos de agente.
📦 Estoque parado
Cruza estoque com vendas para encontrar produtos sem giro na janela escolhida e, para cada um, monta o público que vale abordar: quem abandonou um checkout com aquele produto e quem comprou o mesmo tipo de produto no período. O resultado é um segmento revisável e exportável em CSV para o time de CRM — o Unhide monta a lista, não dispara e-mail.
Como funciona (arquitetura)
App de visão única. Exatamente uma ferramenta carrega UI (unhide_dashboard); todas as
outras são chamadas por dentro dela ou diretamente por um agente. O Vite gera um único HTML
(dist/client/index.html, com CSS e JS inlined) servido como o único recurso MCP.
Os painéis buscam os próprios dados. unhide_dashboard só resolve as configurações (domínio
da loja, período, limites). Cada painel então chama sua própria ferramenta via useServerTool →
app.callServerTool. Consequência prática: os painéis carregam em paralelo e falham
independentemente — uma varredura lenta de SEO nunca segura o analytics, e credencial faltando
quebra uma célula, não a tela.
Host MCP (deco / Claude)
│ chama unhide_dashboard
▼
api/ (servidor MCP, @decocms/runtime) ──► Shopify Admin GraphQL API (ShopifyQL, produtos,
│ serve o recurso ui://mcp-app/… descontos, pedidos, metafields)
▼ ──► Shopify Storefront API (listagem de produtos)
web/ (React 19, bundle único)
└─ cada painel chama de volta o servidor via callServerToolCamadas do código:
api/tools/— a superfície MCP: cada arquivo é uma ferramenta com schemas Zod de entrada e saída.api/lib/— a lógica de verdade: transporte para a Admin API (com retry de throttling e limite de concorrência), consultas ShopifyQL, cálculo de score de SEO/GEO, descontos, lookup de produto.api/app.ts— núcleo agnóstico de plataforma; exporta um handler{ fetch }com middleware de log e o rewrite de/api/mcp→/mcp.api/main.bun.ts— entrypoint Bun (padrão). Para outra plataforma, basta um novoapi/main.<plataforma>.ts.web/— a UI React que conecta no host via@modelcontextprotocol/ext-apps.
Instruções de execução
Pré-requisitos
Bun (runtime do projeto — não Node)
Uma loja Shopify com um custom app criado (para obter os tokens)
Um host MCP para abrir o dashboard (deco Studio, Claude, ou qualquer cliente MCP)
1. Instalar
bun install2. Configurar as variáveis de ambiente
cp .env.example .env
# preencha SHOPIFY_STORE_DOMAIN e os tokens — ver a seção de envs abaixo3. Rodar em desenvolvimento
bun run devSobe duas coisas em paralelo (via concurrently):
a API MCP em
http://localhost:3001, com hot reload → endpoint MCP emhttp://localhost:3001/api/mcpo build do front em modo watch, gerando
dist/client/index.html
⚠️ O recurso da UI lê
dist/client/index.htmldo disco. Rodar sóbun run dev:apisem nunca ter buildado o front faz o dashboard falhar ao abrir — usebun run dev, ou rode umbun run build:webantes.
Comandos individuais:
bun run dev:api # só a API (porta 3001, hot reload)
bun run dev:web # só o build do front (watch)4. Conectar em um host MCP
Para testar em um host remoto (como o deco Studio), exponha o servidor local por um túnel:
bun start
# Tunnel started -> 🌐 Preview: https://<seu-id>.deco.host
# -> 🔗 MCP URL: https://<seu-id>.deco.host/api/mcpDepois, conecte no host usando a MCP URL impressa. Localmente, a URL é
http://localhost:3001/api/mcp.
Com a conexão feita, chame a ferramenta unhide_dashboard — ela é o ponto de entrada visual.
5. Build de produção
bun run build # front + servidor
bun run build:web # só o front -> dist/client/index.html
bun run build:server # só o server -> dist/server/main.js
NODE_ENV=production bun dist/server/main.js6. Docker
docker build -t unhide .
docker run -p 3001:3001 --env-file .env unhideReferência rápida de scripts
Comando | O que faz |
| API + build do front, em paralelo (watch) |
| Só a API, porta 3001, hot reload |
| Só o build do front, em watch |
|
|
| Build completo de produção |
| Type check ( |
| Lint + format check do Biome (modo CI, sem auto-fix) |
| Formata com o Biome |
| Corrige lint automaticamente |
| Roda os testes (test runner do Bun) |
| Roda um arquivo de teste específico |
| Diagnostica valores nulos vindos do ShopifyQL |
Configuração de ambiente (envs)
Todas as variáveis ficam em .env na raiz (há um .env.example versionado como modelo). O .env
está no .gitignore — nunca comite tokens.
Obrigatórias
Variável | Descrição |
| Domínio da loja, sem protocolo. Ex.: |
| Token da Admin API ( |
Opcional (mas necessária para uma ferramenta específica)
Variável | Descrição |
| Token da Storefront API. Usado apenas por |
Opcionais com padrão
Variável | Padrão | Descrição |
|
| Versão da Storefront API |
|
| Versão da Admin API |
|
| Namespace do metafield |
| — | Override ISO 4217 (ex.: |
| — | Qualquer valor liga o trace das chamadas à Admin API no console. Útil para entender por que um número voltou nulo |
|
| Porta do servidor |
| — |
|
Escopos da Admin API
O token precisa dos escopos das ferramentas que você pretende usar:
Escopo | Habilita |
| Todas as ferramentas |
| Relatórios de SEO e GEO, busca e leitura de produto |
|
|
|
|
|
|
|
|
| Dados de contato dos clientes nos segmentos de |
💡 A Shopify limita
read_ordersaos últimos 60 dias. Como a janela padrão do estoque parado é de 90 dias, uma janela maior que 60 dias exige o escoporead_all_orders(concedido sob solicitação à Shopify) — ou reduzadeadStockWindowDays.
Onde obter os tokens: Shopify admin → Settings → Apps and sales channels → Develop apps → seu app → configure os escopos de Admin API (e/ou Storefront API) → Install → revele o token.
Ferramentas MCP disponíveis
19 ferramentas registradas em api/tools/index.ts. Só a primeira carrega UI.
Entrada visual
Ferramenta | O que faz |
| Abre o dashboard do Unhide. Resolve as configurações dos painéis (loja, período, limites) — os dados vêm depois, painel a painel |
Analytics da loja
Ferramenta | O que faz |
| Painel consolidado: funil de navegação, tráfego e intenção por origem, busca interna e quebra de conversão. Seções que falham degradam individualmente, reportadas em |
| Sessões, visitantes, pageviews, bounce, duração, carrinho e checkout — com quebra por device, país, região, cidade, SO, tipo de landing page ou dia |
| Sinais de intenção de compra por origem de tráfego, páginas de produto mais acessadas e split novo × recorrente |
| Termos buscados na loja, intenção detectada, CTR e funil de busca. Filtro para buscas sem resultado |
| Quebra de compras por produto, tipo, coleção, fornecedor, canal ou tipo de cliente, com AOV e share de pedidos |
| Receita atribuída aos descontos criados por este servidor: varre os pedidos da janela e atribui o valor por cupom e por dia |
Catálogo
Ferramenta | O que faz |
| Busca produtos por nome, marca, categoria, tag, SKU ou código de barras. Ponto de partida quando o usuário cita um produto em vez de linkar |
| Carrega tudo de um produto em uma chamada: descrição, SEO e nota, tags, preço, estoque, variantes e imagens. Lista os runner-ups quando o nome foi ambíguo |
| Listagem simples via Storefront API — útil para validar a conexão de saída com a Shopify |
| Atualiza título, descrição, handle, tags, campos de SEO e imagem (por URL ou upload). Só os campos enviados mudam |
SEO
Ferramenta | O que faz |
| Varre o catálogo e pontua o SEO (0–100) de cada produto, com os pontos de melhoria |
| A mesma análise, focada em um produto (aceita handle, id, URL da loja ou URL do admin) |
GEO
Ferramenta | O que faz |
| Varre o catálogo e pontua a saúde de GEO (0–100) pelo metafield |
| A mesma análise, focada em um produto |
| Escreve o |
Ação comercial
Ferramenta | O que faz |
| Cria descontos automáticos em lote (% ou valor fixo, um por produto). Cada desconto é marcado duas vezes (prefixo no título + metafield |
| Lê de volta os descontos criados por aqui, com o metafield do lote já parseado |
| Encontra estoque parado e monta, por produto, o público a abordar (checkout abandonado + quem comprou o mesmo tipo). Retorna segmento para exportação — não dispara nada |
Prompt
Prompt | O que faz |
| Recebe o handle de um produto, analisa os relatórios de SEO e GEO, propõe os campos faltantes e aplica após sua aprovação |
Estrutura de pastas
.
├── api/ # Servidor MCP (agnóstico de plataforma)
│ ├── app.ts # Núcleo: runtime, middleware de log, rota /api/mcp
│ ├── main.bun.ts # Entrypoint Bun (padrão, usado no dev local)
│ ├── tools/ # Uma ferramenta MCP por arquivo (schemas Zod in/out)
│ │ ├── index.ts # Registro de todas as ferramentas
│ │ ├── unhide-dashboard.ts # A única ferramenta com UI (_meta.ui)
│ │ ├── analytics-*.ts # Overview, sessions, intent, search, conversion
│ │ ├── shopify-seo-*.ts # Relatório de SEO (loja e produto)
│ │ ├── shopify-geo-*.ts # Relatório de GEO + update do metafield
│ │ ├── shopify-{get,search,list}-product*.ts
│ │ ├── promotions-*.ts # Criação e listagem de descontos
│ │ ├── dead-stock-campaign.ts # Estoque parado + segmento de clientes
│ │ └── ai-discount-usage.ts # Receita atribuída aos descontos da IA
│ ├── lib/ # Lógica de domínio e transporte
│ │ ├── shopify-admin.ts # Porta única da Admin GraphQL: retry de throttle,
│ │ │ # limite de concorrência, score de SEO, upload de imagem
│ │ ├── shopify-analytics.ts # Consultas ShopifyQL e mapeamento de colunas
│ │ ├── shopify-discounts.ts # Descontos automáticos (criação/leitura)
│ │ ├── seo-report.ts # Varredura e scoring de SEO
│ │ ├── geo-report.ts # Metafield geo_data, scoring de GEO
│ │ ├── product-lookup.ts # Resolve nome/handle/id/URL para um produto
│ │ ├── improve-product-prompt.ts # Texto do prompt de melhoria
│ │ ├── analytics/ # Funis: sessions, intent, search, conversion, descontos
│ │ └── coerce.ts # Coerções de tipo dos retornos do ShopifyQL
│ ├── prompts/ # Prompts MCP (improve-product-data)
│ ├── resources/
│ │ └── unhide-dashboard.ts # Serve dist/client/index.html como recurso MCP
│ └── types/env.ts # StateSchema + tipo Env
│
├── web/ # UI React (MCP App) — bundle único
│ ├── app.tsx # Composição raiz (providers)
│ ├── context.tsx # Ponte com o host MCP + estado da chamada
│ ├── router.tsx # ToolRouter — TOOL_PAGES tem uma entrada só
│ ├── types.ts # McpStatus e tipos do ciclo de vida
│ ├── tools/
│ │ ├── unhide-dashboard/ # A tela: abas, grid, FeaturePanel, useServerTool
│ │ ├── analytics-overview/ # Abas de tráfego, sessões, busca, conversão, descontos IA
│ │ ├── shopify-seo-report/ # Lista + filtros + edição de SEO
│ │ ├── shopify-geo-report/ # Lista + filtros + formulário de GEO
│ │ └── dead-stock-campaign/ # Segmentos + exportação CSV
│ ├── components/
│ │ ├── patterns.tsx # Primitivos do design system (PageShell, Chip, StatTile…)
│ │ ├── ai-fill-button.tsx # Botão "preencher com IA"
│ │ ├── product-score.tsx # Selo de nota do produto
│ │ └── ui/ # shadcn/ui
│ ├── hooks/ · lib/ # use-mobile, cn(), formatadores
│ └── globals.css # Tailwind v4 + fonte Manrope
│
├── scripts/
│ ├── start.ts # `deco link` + túnel, imprime a MCP URL
│ ├── diagnose-analytics.ts # Sondas ShopifyQL para depurar valores nulos
│ └── dev-worktree.ts # Dev server por worktree
│
├── .github/workflows/ # Release: versão, changelog, imagem Docker, deploy Coolify
├── index.html # Entrada única do Vite
├── vite.config.ts # React + Tailwind + singlefile, alias @ -> web/
├── Dockerfile # Build multi-stage em Bun
├── app.json # Manifesto do app deco (nome, conexão, metadados)
├── biome.json · tsconfig.json · components.json
├── .env.example # Modelo das variáveis de ambiente
├── CLAUDE.md / AGENTS.md # Guia para agentes de código neste repo
└── data/ # Snapshots e corpus locais (fora do git)Tecnologias usadas
Runtime e servidor
Bun — runtime, gerenciador de pacotes e test runner
@decocms/runtime — servidor MCP (tools, prompts, resources); exposto em
/api/mcpvia SSE@modelcontextprotocol/sdk — protocolo MCP
Zod v4 — schemas de entrada/saída de toda ferramenta
Front-end
React 19 + React Compiler (via
babel-plugin-react-compiler)@modelcontextprotocol/ext-apps — SDK de MCP Apps: conexão com o host, input/resultado da ferramenta,
callServerToolTanStack Router (hash-based) + TanStack Query
Recharts — gráficos do diagnóstico
lucide-react, sonner, react-hook-form, date-fns
Build e qualidade
Vite 7 + vite-plugin-singlefile — um HTML autocontido, com CSS e JS inlined
Biome — lint + format (tab, aspas duplas, extensão obrigatória nos imports)
TypeScript 5.9 em modo estrito
Integrações externas
Shopify Admin GraphQL API — ShopifyQL (analytics), produtos, metafields, descontos, pedidos
Shopify Storefront API — listagem pública de produtos
Convenções de código
Imports precisam incluir a extensão
.ts/.tsx(useImportExtensions: error)Alias
@/*→web/*Indentação com tab, aspas duplas (Biome)
Todo schema (entrada, saída, estado) em Zod
Design system: glassmorphism suave, sem bordas em containers — use os primitivos de
web/components/patterns.tsx. As regras completas estão emCLAUDE.md
Qualidade, testes e CI
bun test # todos os testes
bun test api/lib/seo-report.test.ts
bun run check # type check
bun run ci:check # lint + format (CI)Os testes ficam ao lado do código que cobrem (*.test.ts) e concentram-se na lógica pura:
scoring de SEO/GEO, mapeamento de colunas do ShopifyQL, coerções, parsing de referência de
produto, montagem de campanhas e geração de CSV.
Para depurar analytics vindo nulo:
bun run scripts/diagnose-analytics.ts # todas as sondas
bun run scripts/diagnose-analytics.ts sessions # só as que casam com "sessions"
bun run scripts/diagnose-analytics.ts --raw # inclui o payload GraphQL cruCada sonda mostra, por coluna, o nome retornado, o dataType e o primeiro valor — o que distingue
"coluna ausente" de "sem dado na janela" de "bug de mapeamento".
Deploy
Multi-plataforma
A separação entre api/app.ts (lógica) e api/main.bun.ts (wiring de plataforma) permite
adicionar um alvo novo com um arquivo fino:
Bun —
api/main.bun.ts(padrão)Cloudflare Workers — ~5 linhas +
wrangler.tomlDeno — ~5 linhas
Node.js — ~5 linhas +
@hono/node-serverAWS Lambda — ~5 linhas +
hono/aws-lambda
Veja a skill add-deploy-target para o passo a passo.
Pipeline atual
O workflow .github/workflows/release.yml dispara em push na main que altere package.json:
prepara a versão e o changelog, cria a release, builda e publica a imagem Docker e aciona o deploy
no Coolify por webhook.
Publicar no deco
Ajuste
app.jsoncom nome, descrição e a URL de conexão do seu appFaça push — o CI valida o build
Siga o fluxo de publicação do deco (veja a skill
publish-store)
Telas do Projeto
Aba Diagnóstico
Aba SEO
Aba GEO
Aba Estoque Parado
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Flicense-qualityDmaintenanceA starter project designed to quickly build and deploy Model Context Protocol (MCP) servers using the TypeScript SDK and Zod for schema validation. It features example implementations for tools and resources, providing a solid foundation for custom MCP development and integration.
- Flicense-qualityDmaintenanceA starter template designed to jumpstart the development of Model Context Protocol (MCP) servers using TypeScript. It provides pre-configured examples for creating tools and resources, along with integration guides for MCP clients like Cursor.
- Alicense-qualityAmaintenanceA starter template for building MCP apps with React widgets, featuring tool execution, UI capability negotiation, and host integration.19Apache 2.0
- Alicense-qualityCmaintenanceA starter template for building MCP and ChatGPT apps using the Skybridge framework.9Apache 2.0
Related MCP Connectors
Build, deploy, and operate hosted web apps on VibeKit (vibekit.bot) from any MCP client.
Generate, edit, and deploy immersive 3D/WebGL web projects from any MCP assistant.
MCP (Model Context Protocol) server for Appwrite
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/gsbenevides2/deco-unhide'
If you have feedback or need assistance with the MCP directory API, please join our Discord server