refine-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/detection/compressor.d.ts +26 -0
  2. package/dist/detection/compressor.js +446 -0
  3. package/dist/detection/concern-map.d.ts +16 -0
  4. package/dist/detection/concern-map.js +236 -0
  5. package/dist/detection/context-extractor.d.ts +39 -0
  6. package/dist/detection/context-extractor.js +390 -0
  7. package/dist/detection/file-tree.d.ts +33 -0
  8. package/dist/detection/file-tree.js +174 -0
  9. package/dist/index.d.ts +10 -0
  10. package/dist/index.js +48 -0
  11. package/dist/prompts/index.d.ts +9 -0
  12. package/dist/prompts/index.js +125 -0
  13. package/dist/resources/identity.d.ts +6 -0
  14. package/dist/resources/identity.js +30 -0
  15. package/dist/resources/index.d.ts +6 -0
  16. package/dist/resources/index.js +14 -0
  17. package/dist/resources/prd.d.ts +6 -0
  18. package/dist/resources/prd.js +30 -0
  19. package/dist/resources/roadmap.d.ts +6 -0
  20. package/dist/resources/roadmap.js +30 -0
  21. package/dist/resources/tokens.d.ts +6 -0
  22. package/dist/resources/tokens.js +30 -0
  23. package/dist/setup.d.ts +11 -0
  24. package/dist/setup.js +429 -0
  25. package/dist/tools/checkin.d.ts +6 -0
  26. package/dist/tools/checkin.js +72 -0
  27. package/dist/tools/complete.d.ts +6 -0
  28. package/dist/tools/complete.js +56 -0
  29. package/dist/tools/get-prompt.d.ts +7 -0
  30. package/dist/tools/get-prompt.js +68 -0
  31. package/dist/tools/get-skill.d.ts +6 -0
  32. package/dist/tools/get-skill.js +57 -0
  33. package/dist/tools/refine-run.d.ts +22 -0
  34. package/dist/tools/refine-run.js +150 -0
  35. package/dist/utils/api.d.ts +12 -0
  36. package/dist/utils/api.js +69 -0
  37. package/dist/utils/config.d.ts +9 -0
  38. package/dist/utils/config.js +24 -0
  39. package/package.json +33 -0
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Scan do file tree do projeto do builder + deteccao de skill por sinais.
3
+ * Modulo puro, sem dependencias externas alem de glob e fs.
4
+ */
5
+ import { existsSync } from "node:fs";
6
+ import { readFile } from "node:fs/promises";
7
+ import { join } from "node:path";
8
+ import { glob } from "glob";
9
+ export const IGNORE_DIRS = ["node_modules", ".git", "dist", "build", ".next"];
10
+ export async function scanFileTree(cwd) {
11
+ const ignorePattern = IGNORE_DIRS.map((d) => `**/${d}/**`);
12
+ const [pages, tests, convexFiles] = await Promise.all([
13
+ glob("**/{pages,app}/**/*.{tsx,jsx}", {
14
+ cwd,
15
+ ignore: ignorePattern,
16
+ maxDepth: 4,
17
+ }),
18
+ glob("**/*.{test,spec}.{ts,tsx,js,jsx}", {
19
+ cwd,
20
+ ignore: ignorePattern,
21
+ maxDepth: 4,
22
+ }),
23
+ glob("convex/*.ts", {
24
+ cwd,
25
+ ignore: [...ignorePattern, "convex/schema.ts", "convex/_generated/**", "convex/auth.ts"],
26
+ }),
27
+ ]);
28
+ // Contar CSS vars em globals.css
29
+ let cssVarCount = 0;
30
+ let colorVarCount = 0;
31
+ const globalsCandidates = ["globals.css", "src/globals.css", "app/globals.css", "src/index.css"];
32
+ for (const candidate of globalsCandidates) {
33
+ const fullPath = join(cwd, candidate);
34
+ if (existsSync(fullPath)) {
35
+ try {
36
+ const content = await readFile(fullPath, "utf-8");
37
+ for (const line of content.split("\n")) {
38
+ const trimmed = line.trim();
39
+ if (trimmed.startsWith("--")) {
40
+ cssVarCount++;
41
+ if (trimmed.startsWith("--color-")) {
42
+ colorVarCount++;
43
+ }
44
+ }
45
+ }
46
+ }
47
+ catch {
48
+ // Ignora erro de leitura
49
+ }
50
+ break;
51
+ }
52
+ }
53
+ // Parsear roadmap.md para extrair progresso de tasks
54
+ const roadmapTasks = await parseRoadmapProgress(cwd);
55
+ const hasPackageJson = existsSync(join(cwd, "package.json"));
56
+ const hasConvex = existsSync(join(cwd, "convex"));
57
+ const hasTailwind = existsSync(join(cwd, "tailwind.config.ts")) ||
58
+ existsSync(join(cwd, "tailwind.config.js")) ||
59
+ existsSync(join(cwd, "postcss.config.ts")) ||
60
+ existsSync(join(cwd, "postcss.config.js")) ||
61
+ existsSync(join(cwd, "postcss.config.mjs"));
62
+ const hasVercelConfig = existsSync(join(cwd, "vercel.json")) || existsSync(join(cwd, ".vercel"));
63
+ return {
64
+ pages,
65
+ tests,
66
+ mutations: convexFiles,
67
+ cssVarCount,
68
+ colorVarCount,
69
+ hasPackageJson,
70
+ hasConvex,
71
+ hasTailwind,
72
+ hasVercelConfig,
73
+ roadmapTasks,
74
+ };
75
+ }
76
+ /**
77
+ * Parseia roadmap.md (ou docs/roadmap.md) e extrai progresso de tasks.
78
+ * Busca checkboxes `- [x]` e `- [ ]` com padrão TASK-NNN.
79
+ */
80
+ async function parseRoadmapProgress(cwd) {
81
+ const candidates = ["docs/roadmap.md", "roadmap.md"];
82
+ let content = null;
83
+ for (const candidate of candidates) {
84
+ const fullPath = join(cwd, candidate);
85
+ if (existsSync(fullPath)) {
86
+ try {
87
+ content = await readFile(fullPath, "utf-8");
88
+ }
89
+ catch {
90
+ // Ignora erro de leitura
91
+ }
92
+ break;
93
+ }
94
+ }
95
+ if (!content)
96
+ return null;
97
+ const lines = content.split("\n");
98
+ let currentPhase = "";
99
+ const byPhase = {};
100
+ const tasksDone = [];
101
+ let total = 0;
102
+ let done = 0;
103
+ const phaseRegex = /^##\s+Fase\s+\d+/;
104
+ const taskDoneRegex = /^- \[x\]\s+.*\*\*(TASK-\d+[A-Z]?)\*\*/;
105
+ const taskTodoRegex = /^- \[ \]\s+.*\*\*(TASK-\d+[A-Z]?)\*\*/;
106
+ for (const line of lines) {
107
+ // Detectar heading de fase
108
+ if (phaseRegex.test(line)) {
109
+ // Extrair nome da fase (ex: "Fase 8: MCP Server")
110
+ const match = line.match(/^##\s+(Fase\s+\d+[A-Z]?(?::\s*.+)?)/);
111
+ currentPhase = match ? match[1].trim() : line.replace(/^##\s+/, "").trim();
112
+ if (!byPhase[currentPhase]) {
113
+ byPhase[currentPhase] = { total: 0, done: 0 };
114
+ }
115
+ continue;
116
+ }
117
+ // Parar antes da seção exploratória (V2)
118
+ if (line.startsWith("## Futuro:"))
119
+ break;
120
+ // Task marcada como done
121
+ const doneMatch = line.match(taskDoneRegex);
122
+ if (doneMatch) {
123
+ total++;
124
+ done++;
125
+ tasksDone.push(doneMatch[1]);
126
+ if (currentPhase && byPhase[currentPhase]) {
127
+ byPhase[currentPhase].total++;
128
+ byPhase[currentPhase].done++;
129
+ }
130
+ continue;
131
+ }
132
+ // Task pendente
133
+ const todoMatch = line.match(taskTodoRegex);
134
+ if (todoMatch) {
135
+ total++;
136
+ if (currentPhase && byPhase[currentPhase]) {
137
+ byPhase[currentPhase].total++;
138
+ }
139
+ }
140
+ }
141
+ return { total, done, tasksDone, byPhase };
142
+ }
143
+ /**
144
+ * Detecta a skill inferida como "mais avancada concluida" baseado nos sinais do file tree.
145
+ * Percorre da prioridade mais alta pra mais baixa.
146
+ */
147
+ export function detectSkill(summary) {
148
+ // Prioridade 8: vercel config -> ship em progresso
149
+ if (summary.hasVercelConfig)
150
+ return "ship";
151
+ // Prioridade 7: >3 test files -> ship em progresso (preparando producao)
152
+ if (summary.tests.length > 3)
153
+ return "ship";
154
+ // Prioridade 6: >3 convex mutations -> feature-dev em progresso
155
+ if (summary.mutations.length > 3)
156
+ return "feature-dev";
157
+ // Prioridade 5: >2 pages -> page-builder em progresso
158
+ if (summary.pages.length > 2)
159
+ return "page-builder";
160
+ // Prioridade 4: >20 CSS vars -> design-system concluido
161
+ if (summary.cssVarCount > 20)
162
+ return "design-system";
163
+ // Prioridade 3: >5 color vars -> identity concluido
164
+ if (summary.colorVarCount > 5)
165
+ return "identity";
166
+ // Prioridade 2: package.json + convex + tailwind -> onboarding (stack pronto)
167
+ if (summary.hasPackageJson && summary.hasConvex && summary.hasTailwind)
168
+ return "onboarding";
169
+ // Prioridade 1: package.json existe -> pre-setup
170
+ if (summary.hasPackageJson)
171
+ return "pre-setup";
172
+ // Prioridade 0: nada
173
+ return "none";
174
+ }
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @refine.build/mcp — MCP Server
4
+ *
5
+ * Conecta a IA do builder (Claude Code, Cursor, Windsurf) ao refine.build.
6
+ * O builder instala uma vez, a IA guia ate o lancamento.
7
+ *
8
+ * Uso: npx @refine.build/mcp --token SEU_TOKEN
9
+ */
10
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @refine.build/mcp — MCP Server
4
+ *
5
+ * Conecta a IA do builder (Claude Code, Cursor, Windsurf) ao refine.build.
6
+ * O builder instala uma vez, a IA guia ate o lancamento.
7
+ *
8
+ * Uso: npx @refine.build/mcp --token SEU_TOKEN
9
+ */
10
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
11
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
12
+ import { registerPrompts } from "./prompts/index.js";
13
+ import { registerResources } from "./resources/index.js";
14
+ import { registerCheckinTool } from "./tools/checkin.js";
15
+ import { registerCompleteSkillTool } from "./tools/complete.js";
16
+ import { registerGetPromptTool } from "./tools/get-prompt.js";
17
+ import { registerGetSkillTool } from "./tools/get-skill.js";
18
+ import { registerRefineRunTool } from "./tools/refine-run.js";
19
+ import { getConfig } from "./utils/config.js";
20
+ const config = getConfig();
21
+ if (!config.token) {
22
+ console.error("Erro: Token nao fornecido. Use --token SEU_TOKEN ou defina REFINE_TOKEN.");
23
+ console.error("Gere seu token em: https://refine.build/account/mcp");
24
+ process.exit(1);
25
+ }
26
+ const server = new McpServer({
27
+ name: "refine-mcp-server",
28
+ version: "0.1.0",
29
+ });
30
+ // Register MCP tools
31
+ registerCheckinTool(server);
32
+ registerGetSkillTool(server);
33
+ registerCompleteSkillTool(server);
34
+ registerGetPromptTool(server);
35
+ registerRefineRunTool(server);
36
+ // Register MCP prompts (slash commands)
37
+ registerPrompts(server);
38
+ // Register MCP resources (project context via @refine:prd, etc.)
39
+ registerResources(server);
40
+ async function main() {
41
+ const transport = new StdioServerTransport();
42
+ await server.connect(transport);
43
+ console.error("refine-build MCP Server running on stdio");
44
+ }
45
+ main().catch((error) => {
46
+ console.error("Fatal error:", error);
47
+ process.exit(1);
48
+ });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Prompts (slash commands) para o refine.build.
3
+ *
4
+ * Nota: MCP Prompts nao sao sugeridos automaticamente pela IA (bug conhecido).
5
+ * A automacao real vem dos tools + regras no CLAUDE.md.
6
+ * Estes prompts servem como atalhos manuais: /refine:status, /refine:next, etc.
7
+ */
8
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ export declare function registerPrompts(server: McpServer): void;
@@ -0,0 +1,125 @@
1
+ /**
2
+ * MCP Prompts (slash commands) para o refine.build.
3
+ *
4
+ * Nota: MCP Prompts nao sao sugeridos automaticamente pela IA (bug conhecido).
5
+ * A automacao real vem dos tools + regras no CLAUDE.md.
6
+ * Estes prompts servem como atalhos manuais: /refine:status, /refine:next, etc.
7
+ */
8
+ import { z } from "zod";
9
+ export function registerPrompts(server) {
10
+ // /refine:status — chama checkin + mostra progresso
11
+ server.registerPrompt("refine:status", {
12
+ title: "Status do Fluxo",
13
+ description: "Mostra progresso atual do projeto no fluxo guiado do refine.build.",
14
+ }, () => ({
15
+ messages: [
16
+ {
17
+ role: "user",
18
+ content: {
19
+ type: "text",
20
+ text: [
21
+ "Chame a tool refine_checkin para verificar o status do meu projeto no refine.build.",
22
+ "Mostre: etapa ativa, fase, progresso geral e o que preciso fazer agora.",
23
+ "Se houver discrepancia entre o que o servidor diz e o que voce detecta no codigo, mencione.",
24
+ ].join("\n"),
25
+ },
26
+ },
27
+ ],
28
+ }));
29
+ // /refine:next — mostra proxima skill + oferece iniciar
30
+ server.registerPrompt("refine:next", {
31
+ title: "Proxima Etapa",
32
+ description: "Mostra a proxima etapa do fluxo e oferece iniciar com o prompt completo.",
33
+ }, () => ({
34
+ messages: [
35
+ {
36
+ role: "user",
37
+ content: {
38
+ type: "text",
39
+ text: [
40
+ "Chame refine_get_skill para ver a etapa ativa do meu projeto.",
41
+ "Depois chame refine_get_prompt com o ID da etapa ativa para obter as instrucoes completas.",
42
+ "Me mostre um resumo do que essa skill faz e pergunte se posso comecar.",
43
+ ].join("\n"),
44
+ },
45
+ },
46
+ ],
47
+ }));
48
+ // /refine:complete — marca skill atual como concluida
49
+ server.registerPrompt("refine:complete", {
50
+ title: "Completar Etapa",
51
+ description: "Marca a etapa ativa como concluida e avanca para a proxima.",
52
+ }, () => ({
53
+ messages: [
54
+ {
55
+ role: "user",
56
+ content: {
57
+ type: "text",
58
+ text: [
59
+ "Chame refine_get_skill para descobrir qual e a etapa ativa.",
60
+ "Liste os arquivos relevantes que foram criados ou modificados nessa etapa.",
61
+ "Pergunte se posso marcar como concluida.",
62
+ "Se eu confirmar, chame refine_complete_skill com o skillId correto e a lista de arquivos como evidencia.",
63
+ ].join("\n"),
64
+ },
65
+ },
66
+ ],
67
+ }));
68
+ // /refine:skill <nome> — puxa prompt especifico
69
+ server.registerPrompt("refine:skill", {
70
+ title: "Prompt de Skill",
71
+ description: "Busca o prompt completo de uma skill especifica para conduzir no IDE.",
72
+ argsSchema: {
73
+ skill: z
74
+ .string()
75
+ .describe("ID da skill (ex: page-builder, onboarding, motion, feature-dev)"),
76
+ },
77
+ }, ({ skill }) => ({
78
+ messages: [
79
+ {
80
+ role: "user",
81
+ content: {
82
+ type: "text",
83
+ text: [
84
+ `Chame refine_get_prompt com skill="${skill}" para obter as instrucoes completas.`,
85
+ "Use o prompt retornado como guia para conduzir essa skill fase por fase.",
86
+ "Comece pela Fase 1 e siga a ordem indicada no prompt.",
87
+ ].join("\n"),
88
+ },
89
+ },
90
+ ],
91
+ }));
92
+ // /refine:help — lista comandos
93
+ server.registerPrompt("refine:help", {
94
+ title: "Ajuda Refine",
95
+ description: "Lista todos os comandos disponiveis do refine.build MCP.",
96
+ }, () => ({
97
+ messages: [
98
+ {
99
+ role: "user",
100
+ content: {
101
+ type: "text",
102
+ text: [
103
+ "Mostre a lista de comandos do refine.build MCP disponíveis:",
104
+ "",
105
+ "**Slash Commands (Prompts):**",
106
+ "- `/refine:status` — Verifica progresso do projeto no fluxo",
107
+ "- `/refine:next` — Mostra proxima etapa e oferece iniciar",
108
+ "- `/refine:complete` — Marca etapa ativa como concluida",
109
+ "- `/refine:skill <nome>` — Busca prompt de uma etapa especifica",
110
+ "- `/refine:help` — Esta lista",
111
+ "",
112
+ "**Tools (chamados automaticamente):**",
113
+ "- `refine_checkin` — Escaneia projeto e detecta etapa ativa",
114
+ "- `refine_get_skill` — Retorna etapa ativa + contexto do plano",
115
+ "- `refine_complete_skill` — Marca etapa como concluida",
116
+ "- `refine_get_prompt` — Retorna prompt completo de uma etapa",
117
+ "- `refine_run` — Executa auditoria automatizada (security, schema, design-system, responsive, pre-deploy, performance, ux-laws, consistency, motion-audit, auth-check, env-check, taste-review, product-check, refactor-audit, pivot-audit, debug, product, placeholders)",
118
+ "",
119
+ "**Dica:** No inicio de cada sessao, chame `refine_checkin` automaticamente.",
120
+ ].join("\n"),
121
+ },
122
+ },
123
+ ],
124
+ }));
125
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Resource refine://identity — Brand identity do projeto ativo.
3
+ * A IA do IDE referencia via @refine:identity pra definir cores, fontes e personalidade.
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ export declare function registerIdentityResource(server: McpServer): void;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Resource refine://identity — Brand identity do projeto ativo.
3
+ * A IA do IDE referencia via @refine:identity pra definir cores, fontes e personalidade.
4
+ */
5
+ import { apiGet } from "../utils/api.js";
6
+ export function registerIdentityResource(server) {
7
+ server.registerResource("refine-identity", "refine://identity", {
8
+ title: "Brand Identity",
9
+ description: "Brand identity do projeto: personalidade, paleta de cores, tipografia e motion",
10
+ mimeType: "application/json",
11
+ }, async (uri) => {
12
+ const response = await apiGet("/api/mcp/project-context", { resource: "identity" });
13
+ if (!response.ok || !response.data) {
14
+ return {
15
+ contents: [
16
+ { uri: uri.href, text: `Erro ao buscar identity: ${response.error ?? "Sem resposta"}` },
17
+ ],
18
+ };
19
+ }
20
+ const data = response.data;
21
+ if (data.empty) {
22
+ return {
23
+ contents: [{ uri: uri.href, text: String(data.message) }],
24
+ };
25
+ }
26
+ return {
27
+ contents: [{ uri: uri.href, text: JSON.stringify(data, null, 2) }],
28
+ };
29
+ });
30
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Registra todos os MCP Resources do refine.build.
3
+ * Resources permitem a IA do IDE referenciar dados do projeto via @refine:prd, etc.
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ export declare function registerResources(server: McpServer): void;
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Registra todos os MCP Resources do refine.build.
3
+ * Resources permitem a IA do IDE referenciar dados do projeto via @refine:prd, etc.
4
+ */
5
+ import { registerIdentityResource } from "./identity.js";
6
+ import { registerPrdResource } from "./prd.js";
7
+ import { registerRoadmapResource } from "./roadmap.js";
8
+ import { registerTokensResource } from "./tokens.js";
9
+ export function registerResources(server) {
10
+ registerPrdResource(server);
11
+ registerIdentityResource(server);
12
+ registerTokensResource(server);
13
+ registerRoadmapResource(server);
14
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Resource refine://prd — PRD completo do projeto ativo.
3
+ * A IA do IDE referencia via @refine:prd pra ter contexto do produto.
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ export declare function registerPrdResource(server: McpServer): void;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Resource refine://prd — PRD completo do projeto ativo.
3
+ * A IA do IDE referencia via @refine:prd pra ter contexto do produto.
4
+ */
5
+ import { apiGet } from "../utils/api.js";
6
+ export function registerPrdResource(server) {
7
+ server.registerResource("refine-prd", "refine://prd", {
8
+ title: "PRD do Projeto",
9
+ description: "PRD completo do projeto ativo: produto, comportamento, design, estrutura e dados",
10
+ mimeType: "application/json",
11
+ }, async (uri) => {
12
+ const response = await apiGet("/api/mcp/project-context", { resource: "prd" });
13
+ if (!response.ok || !response.data) {
14
+ return {
15
+ contents: [
16
+ { uri: uri.href, text: `Erro ao buscar PRD: ${response.error ?? "Sem resposta"}` },
17
+ ],
18
+ };
19
+ }
20
+ const data = response.data;
21
+ if (data.empty) {
22
+ return {
23
+ contents: [{ uri: uri.href, text: String(data.message) }],
24
+ };
25
+ }
26
+ return {
27
+ contents: [{ uri: uri.href, text: JSON.stringify(data, null, 2) }],
28
+ };
29
+ });
30
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Resource refine://roadmap — Roadmap com fases, tasks e status do projeto ativo.
3
+ * A IA do IDE referencia via @refine:roadmap pra saber proxima task.
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ export declare function registerRoadmapResource(server: McpServer): void;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Resource refine://roadmap — Roadmap com fases, tasks e status do projeto ativo.
3
+ * A IA do IDE referencia via @refine:roadmap pra saber proxima task.
4
+ */
5
+ import { apiGet } from "../utils/api.js";
6
+ export function registerRoadmapResource(server) {
7
+ server.registerResource("refine-roadmap", "refine://roadmap", {
8
+ title: "Roadmap do Projeto",
9
+ description: "Roadmap com fases, tasks e status (todo/doing/done) e progresso por fase",
10
+ mimeType: "application/json",
11
+ }, async (uri) => {
12
+ const response = await apiGet("/api/mcp/project-context", { resource: "roadmap" });
13
+ if (!response.ok || !response.data) {
14
+ return {
15
+ contents: [
16
+ { uri: uri.href, text: `Erro ao buscar roadmap: ${response.error ?? "Sem resposta"}` },
17
+ ],
18
+ };
19
+ }
20
+ const data = response.data;
21
+ if (data.empty) {
22
+ return {
23
+ contents: [{ uri: uri.href, text: String(data.message) }],
24
+ };
25
+ }
26
+ return {
27
+ contents: [{ uri: uri.href, text: JSON.stringify(data, null, 2) }],
28
+ };
29
+ });
30
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Resource refine://tokens — Design tokens + CSS do projeto ativo.
3
+ * A IA do IDE referencia via @refine:tokens pra aplicar variaveis CSS no projeto.
4
+ */
5
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
+ export declare function registerTokensResource(server: McpServer): void;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Resource refine://tokens — Design tokens + CSS do projeto ativo.
3
+ * A IA do IDE referencia via @refine:tokens pra aplicar variaveis CSS no projeto.
4
+ */
5
+ import { apiGet } from "../utils/api.js";
6
+ export function registerTokensResource(server) {
7
+ server.registerResource("refine-tokens", "refine://tokens", {
8
+ title: "Design Tokens",
9
+ description: "Design tokens do projeto: variaveis CSS, espacamento, borders, shadows e component list",
10
+ mimeType: "application/json",
11
+ }, async (uri) => {
12
+ const response = await apiGet("/api/mcp/project-context", { resource: "tokens" });
13
+ if (!response.ok || !response.data) {
14
+ return {
15
+ contents: [
16
+ { uri: uri.href, text: `Erro ao buscar tokens: ${response.error ?? "Sem resposta"}` },
17
+ ],
18
+ };
19
+ }
20
+ const data = response.data;
21
+ if (data.empty) {
22
+ return {
23
+ contents: [{ uri: uri.href, text: String(data.message) }],
24
+ };
25
+ }
26
+ return {
27
+ contents: [{ uri: uri.href, text: JSON.stringify(data, null, 2) }],
28
+ };
29
+ });
30
+ }
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Setup wizard: npx @refine.build/mcp setup
4
+ *
5
+ * 1. Pede token (ou abre browser)
6
+ * 2. Detecta IDE (Claude Code, Cursor, Windsurf)
7
+ * 3. Gera config pro IDE detectado
8
+ * 4. Copia CLAUDE.md pro projeto se nao existe
9
+ * 5. Confirma setup
10
+ */
11
+ export {};