zerosync-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.
package/README.md ADDED
@@ -0,0 +1,116 @@
1
+ # zerosync-mcp
2
+
3
+ Servidor [MCP](https://modelcontextprotocol.io) (stdio) que expõe as ações do **ZeroSync** como ferramentas para assistentes de IA (Claude Desktop, n8n, código próprio, etc.).
4
+
5
+ Ele é um wrapper fino sobre a **API REST pública v1** do ZeroSync (`https://app.zerosync.com.br/api/v1`), autenticado por um **Personal Access Token (PAT)**. O servidor não acessa o banco diretamente — todo o isolamento por usuário é garantido pela própria API.
6
+
7
+ ## Ferramentas disponíveis
8
+
9
+ | Tool | O que faz | Endpoint v1 |
10
+ | --- | --- | --- |
11
+ | `criar_tarefa` | Cria tarefa/compromisso na agenda | `POST /tasks` |
12
+ | `listar_agenda` | Lista tarefas de um dia | `GET /tasks` |
13
+ | `lancar_despesa` | Lança uma despesa | `POST /transactions` (type=expense) |
14
+ | `lancar_receita` | Lança uma receita | `POST /transactions` (type=income) |
15
+ | `resumo_financeiro` | Resumo do mês (entradas/saídas/saldo) | `GET /finance/summary` |
16
+ | `marcar_habito` | Marca um hábito como feito | `POST /habits/log` |
17
+ | `listar_habitos` | Lista hábitos e status do dia | `GET /habits` |
18
+ | `add_compra` | Adiciona item à lista de compras | `POST /shopping` |
19
+ | `criar_objetivo` | Cria um objetivo/meta | `POST /goals` |
20
+ | `add_nota` | Adiciona nota de diário | `POST /notes` |
21
+
22
+ Cada ferramenta retorna o texto de resumo (`summary`) devolvido pela API.
23
+
24
+ ## Pré-requisitos
25
+
26
+ - Node.js 18+ (testado em 20/22/24; usa o `fetch` global).
27
+ - Um **Personal Access Token** do ZeroSync. Gere em `https://app.zerosync.com.br` (seção de API/tokens).
28
+
29
+ ## Variáveis de ambiente
30
+
31
+ | Variável | Obrigatória | Default | Descrição |
32
+ | --- | --- | --- | --- |
33
+ | `ZEROSYNC_API_KEY` | **Sim** | — | Seu Personal Access Token (PAT). |
34
+ | `ZEROSYNC_API_URL` | Não | `https://app.zerosync.com.br/api/v1` | Base da API v1 (útil para apontar para um ambiente local/staging). |
35
+
36
+ Se `ZEROSYNC_API_KEY` não estiver definida, o servidor encerra com uma mensagem clara.
37
+
38
+ ## Instalação e build
39
+
40
+ ```bash
41
+ cd packages/zerosync-mcp
42
+ npm install
43
+ npm run build # compila TypeScript para dist/
44
+ ```
45
+
46
+ Para desenvolvimento sem build, use `npm run dev` (executa via `tsx`).
47
+
48
+ ## Conectar no Claude Desktop
49
+
50
+ Edite o arquivo de configuração do Claude Desktop:
51
+
52
+ - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
53
+ - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
54
+
55
+ Adicione o servidor em `mcpServers`. A forma recomendada é via `npx` (quando o pacote estiver publicado no npm):
56
+
57
+ ```json
58
+ {
59
+ "mcpServers": {
60
+ "zerosync": {
61
+ "command": "npx",
62
+ "args": ["-y", "zerosync-mcp"],
63
+ "env": {
64
+ "ZEROSYNC_API_KEY": "seu_personal_access_token_aqui"
65
+ }
66
+ }
67
+ }
68
+ }
69
+ ```
70
+
71
+ ### Rodando a partir do código local (sem publicar no npm)
72
+
73
+ Aponte diretamente para o `dist/index.js` gerado pelo build:
74
+
75
+ ```json
76
+ {
77
+ "mcpServers": {
78
+ "zerosync": {
79
+ "command": "node",
80
+ "args": ["C:\\Users\\voce\\Apps\\ZeroSync\\packages\\zerosync-mcp\\dist\\index.js"],
81
+ "env": {
82
+ "ZEROSYNC_API_KEY": "seu_personal_access_token_aqui"
83
+ }
84
+ }
85
+ }
86
+ }
87
+ ```
88
+
89
+ Para apontar para um ambiente local da API, adicione `"ZEROSYNC_API_URL": "http://localhost:3000/api/v1"` ao bloco `env`.
90
+
91
+ Depois de salvar, reinicie o Claude Desktop. As ferramentas `criar_tarefa`, `lancar_despesa`, etc. ficarão disponíveis.
92
+
93
+ ## Usar com n8n / código próprio
94
+
95
+ Qualquer cliente MCP que fale stdio funciona. Inicie o processo com a env definida:
96
+
97
+ ```bash
98
+ ZEROSYNC_API_KEY=seu_token npx -y zerosync-mcp
99
+ # ou, a partir do build local:
100
+ ZEROSYNC_API_KEY=seu_token node dist/index.js
101
+ ```
102
+
103
+ No Windows (PowerShell):
104
+
105
+ ```powershell
106
+ $env:ZEROSYNC_API_KEY = "seu_token"; node dist/index.js
107
+ ```
108
+
109
+ ## Erros comuns
110
+
111
+ | Mensagem | Causa | Solução |
112
+ | --- | --- | --- |
113
+ | `ZEROSYNC_API_KEY não definida` | Env ausente | Defina a variável com seu PAT. |
114
+ | `Token inválido ou revogado` | Token errado/revogado | Gere um novo PAT no ZeroSync. |
115
+ | `Seu token não tem permissão (escopo)` | PAT sem o escopo necessário (read/write) | Gere um token com o escopo adequado. |
116
+ | `Não consegui falar com o ZeroSync` | Rede/URL incorreta | Verifique conexão e `ZEROSYNC_API_URL`. |
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /** Erro HTTP da API v1, carregando status + corpo já parseado quando possível. */
3
+ export declare class ApiError extends Error {
4
+ status: number;
5
+ code: string;
6
+ body?: unknown | undefined;
7
+ constructor(status: number, code: string, message: string, body?: unknown | undefined);
8
+ }
9
+ export type HttpMethod = "GET" | "POST" | "PATCH" | "DELETE";
10
+ /**
11
+ * Faz uma chamada autenticada à API v1.
12
+ *
13
+ * - `path` é relativo à base (ex: "/tasks", "/finance/summary?month=2026-06").
14
+ * - Em sucesso, retorna o corpo JSON já parseado (ou `{}` se vazio).
15
+ * - Em erro HTTP, lança `ApiError` com a mensagem do campo `error` da API
16
+ * (helper `apiError` do backend devolve `{ error: "<code>", ... }`).
17
+ */
18
+ export declare function call<T = unknown>(config: {
19
+ apiKey: string;
20
+ apiUrl: string;
21
+ }, method: HttpMethod, path: string, body?: unknown): Promise<T>;
package/dist/index.js ADDED
@@ -0,0 +1,156 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * zerosync-mcp — servidor MCP (stdio) que expõe as ações do ZeroSync.
4
+ *
5
+ * Cada tool é um wrapper fino sobre a API REST pública v1 do ZeroSync
6
+ * (`https://app.zerosync.com.br/api/v1`), autenticada por um Personal Access
7
+ * Token (PAT) do usuário. O servidor NÃO fala com o banco direto: ele só faz
8
+ * HTTP, então o isolamento por usuário continua garantido pela própria API.
9
+ *
10
+ * Variáveis de ambiente:
11
+ * - ZEROSYNC_API_KEY (obrigatória) — o PAT do usuário (`Bearer <token>`).
12
+ * - ZEROSYNC_API_URL (opcional) — base da API. Default:
13
+ * https://app.zerosync.com.br/api/v1
14
+ */
15
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
16
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
17
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
18
+ import { tools } from "./tools.js";
19
+ const DEFAULT_API_URL = "https://app.zerosync.com.br/api/v1";
20
+ /** Configuração lida do ambiente. Falha cedo e com mensagem clara. */
21
+ function loadConfig() {
22
+ const apiKey = process.env.ZEROSYNC_API_KEY?.trim();
23
+ if (!apiKey) {
24
+ console.error("[zerosync-mcp] ERRO: variável de ambiente ZEROSYNC_API_KEY não definida.\n" +
25
+ "Gere um Personal Access Token em https://app.zerosync.com.br e exponha-o como ZEROSYNC_API_KEY.");
26
+ process.exit(1);
27
+ }
28
+ const apiUrl = (process.env.ZEROSYNC_API_URL?.trim() || DEFAULT_API_URL).replace(/\/+$/, "");
29
+ return { apiKey, apiUrl };
30
+ }
31
+ /** Erro HTTP da API v1, carregando status + corpo já parseado quando possível. */
32
+ export class ApiError extends Error {
33
+ status;
34
+ code;
35
+ body;
36
+ constructor(status, code, message, body) {
37
+ super(message);
38
+ this.status = status;
39
+ this.code = code;
40
+ this.body = body;
41
+ this.name = "ApiError";
42
+ }
43
+ }
44
+ /**
45
+ * Faz uma chamada autenticada à API v1.
46
+ *
47
+ * - `path` é relativo à base (ex: "/tasks", "/finance/summary?month=2026-06").
48
+ * - Em sucesso, retorna o corpo JSON já parseado (ou `{}` se vazio).
49
+ * - Em erro HTTP, lança `ApiError` com a mensagem do campo `error` da API
50
+ * (helper `apiError` do backend devolve `{ error: "<code>", ... }`).
51
+ */
52
+ export async function call(config, method, path, body) {
53
+ const url = `${config.apiUrl}${path.startsWith("/") ? path : `/${path}`}`;
54
+ let res;
55
+ try {
56
+ res = await fetch(url, {
57
+ method,
58
+ headers: {
59
+ Authorization: `Bearer ${config.apiKey}`,
60
+ Accept: "application/json",
61
+ ...(body !== undefined ? { "Content-Type": "application/json" } : {}),
62
+ },
63
+ body: body !== undefined ? JSON.stringify(body) : undefined,
64
+ });
65
+ }
66
+ catch (err) {
67
+ // Falha de rede / DNS / conexão recusada.
68
+ throw new ApiError(0, "network_error", `Não consegui falar com o ZeroSync (${url}): ${err instanceof Error ? err.message : String(err)}`);
69
+ }
70
+ const text = await res.text();
71
+ let parsed = undefined;
72
+ if (text.length > 0) {
73
+ try {
74
+ parsed = JSON.parse(text);
75
+ }
76
+ catch {
77
+ parsed = text; // resposta não-JSON (ex: HTML de erro 5xx atrás de proxy)
78
+ }
79
+ }
80
+ if (!res.ok) {
81
+ const code = extractErrorCode(parsed) ?? `http_${res.status}`;
82
+ throw new ApiError(res.status, code, humanizeError(res.status, code), parsed);
83
+ }
84
+ return (parsed ?? {});
85
+ }
86
+ /** Extrai o campo `error` (string) do corpo de erro padrão da API v1. */
87
+ function extractErrorCode(parsed) {
88
+ if (parsed && typeof parsed === "object" && "error" in parsed) {
89
+ const err = parsed.error;
90
+ if (typeof err === "string" && err.length > 0)
91
+ return err;
92
+ }
93
+ return null;
94
+ }
95
+ /** Mensagens amigáveis em PT-BR para os erros padrão da API v1. */
96
+ function humanizeError(status, code) {
97
+ switch (code) {
98
+ case "missing_token":
99
+ return "Token ausente. Configure ZEROSYNC_API_KEY com seu PAT do ZeroSync.";
100
+ case "invalid_token":
101
+ return "Token inválido ou revogado. Gere um novo PAT no ZeroSync.";
102
+ case "insufficient_scope":
103
+ return "Seu token não tem permissão (escopo) para esta operação.";
104
+ default:
105
+ if (status === 404)
106
+ return "Recurso não encontrado.";
107
+ if (status === 400)
108
+ return `Requisição inválida (${code}).`;
109
+ if (status >= 500)
110
+ return `Erro interno do ZeroSync (${code}).`;
111
+ return `Erro ${status}: ${code}`;
112
+ }
113
+ }
114
+ async function main() {
115
+ const config = loadConfig();
116
+ const server = new Server({ name: "zerosync-mcp", version: "0.1.0" }, { capabilities: { tools: {} } });
117
+ const byName = new Map(tools.map((t) => [t.name, t]));
118
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
119
+ tools: tools.map((t) => ({
120
+ name: t.name,
121
+ description: t.description,
122
+ inputSchema: t.inputSchema,
123
+ })),
124
+ }));
125
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
126
+ const tool = byName.get(req.params.name);
127
+ if (!tool) {
128
+ return {
129
+ isError: true,
130
+ content: [{ type: "text", text: `Tool desconhecida: ${req.params.name}` }],
131
+ };
132
+ }
133
+ try {
134
+ const args = (req.params.arguments ?? {});
135
+ const text = await tool.run((method, path, b) => call(config, method, path, b), args);
136
+ return { content: [{ type: "text", text }] };
137
+ }
138
+ catch (err) {
139
+ const message = err instanceof ApiError
140
+ ? err.message
141
+ : err instanceof Error
142
+ ? err.message
143
+ : String(err);
144
+ return { isError: true, content: [{ type: "text", text: message }] };
145
+ }
146
+ });
147
+ const transport = new StdioServerTransport();
148
+ await server.connect(transport);
149
+ // stderr não polui o protocolo (stdout é reservado pro JSON-RPC do MCP).
150
+ console.error("[zerosync-mcp] conectado via stdio. API base:", config.apiUrl);
151
+ }
152
+ main().catch((err) => {
153
+ console.error("[zerosync-mcp] falha fatal:", err);
154
+ process.exit(1);
155
+ });
156
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { HttpMethod } from "./index.js";
2
+ /** Assinatura do helper de chamada HTTP injetado pelo servidor. */
3
+ export type Caller = <T = unknown>(method: HttpMethod, path: string, body?: unknown) => Promise<T>;
4
+ export interface ToolDef {
5
+ name: string;
6
+ description: string;
7
+ /** JSON Schema (draft-07-ish) exposto no list_tools do MCP. */
8
+ inputSchema: {
9
+ type: "object";
10
+ properties: Record<string, unknown>;
11
+ required?: string[];
12
+ additionalProperties?: boolean;
13
+ };
14
+ /** Valida + executa. Recebe o caller e os args crus do cliente. */
15
+ run: (call: Caller, args: Record<string, unknown>) => Promise<string>;
16
+ }
17
+ export declare const tools: ToolDef[];
package/dist/tools.js ADDED
@@ -0,0 +1,409 @@
1
+ /**
2
+ * Declaração das MCP tools do ZeroSync.
3
+ *
4
+ * Cada tool espelha um endpoint da API v1. O fluxo é sempre:
5
+ * 1. valida os argumentos com Zod (mensagens em PT-BR),
6
+ * 2. chama a API via o helper `call` injetado,
7
+ * 3. extrai e retorna um texto legível (o `summary`/resultado da API).
8
+ *
9
+ * `inputSchema` é JSON Schema (o que o protocolo MCP exige no list_tools).
10
+ * Mantemos JSON Schema + Zod lado a lado: o JSON Schema é o contrato exposto
11
+ * ao cliente MCP; o Zod garante a validação em runtime antes do fetch.
12
+ */
13
+ import { z } from "zod";
14
+ // ----------------------------------------------------------------- helpers
15
+ const YMD = z
16
+ .string()
17
+ .regex(/^\d{4}-\d{2}-\d{2}$/, "Data esperada no formato AAAA-MM-DD.");
18
+ const HHMM = z
19
+ .string()
20
+ .regex(/^\d{2}:\d{2}$/, "Hora esperada no formato HH:MM.");
21
+ const YM = z
22
+ .string()
23
+ .regex(/^\d{4}-\d{2}$/, "Mês esperado no formato AAAA-MM.");
24
+ /** Constrói um ToolDef validando os args com um schema Zod antes de rodar. */
25
+ function defineTool(opts) {
26
+ return {
27
+ name: opts.name,
28
+ description: opts.description,
29
+ inputSchema: opts.inputSchema,
30
+ run: async (call, raw) => {
31
+ const parsed = opts.schema.safeParse(raw);
32
+ if (!parsed.success) {
33
+ const msg = parsed.error.issues
34
+ .map((i) => `${i.path.join(".") || "(raiz)"}: ${i.message}`)
35
+ .join("; ");
36
+ throw new Error(`Argumentos inválidos — ${msg}`);
37
+ }
38
+ return opts.handler(call, parsed.data);
39
+ },
40
+ };
41
+ }
42
+ /** Remove chaves undefined pra não enviar lixo no corpo JSON. */
43
+ function clean(obj) {
44
+ const out = {};
45
+ for (const [k, v] of Object.entries(obj)) {
46
+ if (v !== undefined)
47
+ out[k] = v;
48
+ }
49
+ return out;
50
+ }
51
+ /** Monta uma querystring a partir de pares definidos. */
52
+ function qs(params) {
53
+ const sp = new URLSearchParams();
54
+ for (const [k, v] of Object.entries(params)) {
55
+ if (v !== undefined && v !== "")
56
+ sp.set(k, v);
57
+ }
58
+ const s = sp.toString();
59
+ return s ? `?${s}` : "";
60
+ }
61
+ /**
62
+ * Extrai um texto legível de uma resposta da API.
63
+ *
64
+ * A v1 padroniza ações de domínio como `{ summary, entityType?, entityId? }`
65
+ * (ActionResult). Alguns endpoints de leitura devolvem outros formatos
66
+ * (`{ result }`, `{ message }`, listas), então tentamos os campos comuns e
67
+ * caímos pro JSON cru como último recurso.
68
+ */
69
+ function textFrom(res, fallback = "Operação concluída.") {
70
+ if (res == null)
71
+ return fallback;
72
+ if (typeof res === "string")
73
+ return res;
74
+ if (typeof res === "object") {
75
+ const o = res;
76
+ for (const key of ["summary", "result", "message", "text"]) {
77
+ const v = o[key];
78
+ if (typeof v === "string" && v.trim())
79
+ return v;
80
+ }
81
+ }
82
+ try {
83
+ return JSON.stringify(res, null, 2);
84
+ }
85
+ catch {
86
+ return fallback;
87
+ }
88
+ }
89
+ // ----------------------------------------------------------------- schemas
90
+ const criarTarefaSchema = z.object({
91
+ title: z.string().min(1, "Título obrigatório."),
92
+ date: YMD.optional(),
93
+ start_time: HHMM.optional(),
94
+ duration_minutes: z.number().int().positive().optional(),
95
+ description: z.string().optional(),
96
+ category: z.string().optional(),
97
+ });
98
+ const listarAgendaSchema = z.object({
99
+ date: YMD.optional(),
100
+ });
101
+ const transacaoSchema = z.object({
102
+ amount: z.number().positive("O valor deve ser maior que zero."),
103
+ description: z.string().min(1, "Descrição obrigatória."),
104
+ category: z.string().optional(),
105
+ account: z.string().optional(),
106
+ date: YMD.optional(),
107
+ });
108
+ const resumoFinanceiroSchema = z.object({
109
+ month: YM.optional(),
110
+ });
111
+ const marcarHabitoSchema = z.object({
112
+ habit_name: z.string().min(1, "Nome do hábito obrigatório."),
113
+ quantity: z.number().positive().optional(),
114
+ date: YMD.optional(),
115
+ });
116
+ const listarHabitosSchema = z.object({
117
+ date: YMD.optional(),
118
+ });
119
+ const addCompraSchema = z.object({
120
+ title: z.string().min(1, "Título obrigatório."),
121
+ horizon: z.enum(["short", "medium", "long"]).optional(),
122
+ quantity: z.number().int().positive().optional(),
123
+ estimated_price: z.number().nonnegative().optional(),
124
+ category: z.string().optional(),
125
+ notes: z.string().optional(),
126
+ });
127
+ const criarObjetivoSchema = z.object({
128
+ title: z.string().min(1, "Título obrigatório."),
129
+ description: z.string().optional(),
130
+ horizon: z.enum(["short", "medium", "long"]).optional(),
131
+ target_date: YMD.optional(),
132
+ });
133
+ const addNotaSchema = z.object({
134
+ content: z.string().min(1, "Conteúdo obrigatório."),
135
+ title: z.string().optional(),
136
+ date: YMD.optional(),
137
+ type: z.enum(["journal", "gratidao", "reflexao"]).optional(),
138
+ mood: z.number().int().min(1).max(5).optional(),
139
+ tags: z.array(z.string()).optional(),
140
+ });
141
+ // ----------------------------------------------------------------- tools
142
+ export const tools = [
143
+ defineTool({
144
+ name: "criar_tarefa",
145
+ description: "Cria uma tarefa/compromisso na agenda do ZeroSync. Use para agendar algo num dia e horário.",
146
+ schema: criarTarefaSchema,
147
+ inputSchema: {
148
+ type: "object",
149
+ properties: {
150
+ title: { type: "string", description: "Título da tarefa." },
151
+ date: {
152
+ type: "string",
153
+ description: "Data no formato AAAA-MM-DD. Default: hoje.",
154
+ },
155
+ start_time: {
156
+ type: "string",
157
+ description: "Hora de início HH:MM. Default: 09:00.",
158
+ },
159
+ duration_minutes: {
160
+ type: "integer",
161
+ description: "Duração em minutos. Default: 30.",
162
+ },
163
+ description: { type: "string", description: "Detalhes da tarefa." },
164
+ category: {
165
+ type: "string",
166
+ description: "Nome da categoria (aproximado; será resolvido).",
167
+ },
168
+ },
169
+ required: ["title"],
170
+ additionalProperties: false,
171
+ },
172
+ handler: async (call, args) => {
173
+ const res = await call("POST", "/tasks", clean(args));
174
+ return textFrom(res, `Tarefa "${args.title}" criada.`);
175
+ },
176
+ }),
177
+ defineTool({
178
+ name: "listar_agenda",
179
+ description: "Consulta a agenda do ZeroSync para um dia (lista as tarefas e horários).",
180
+ schema: listarAgendaSchema,
181
+ inputSchema: {
182
+ type: "object",
183
+ properties: {
184
+ date: {
185
+ type: "string",
186
+ description: "Data AAAA-MM-DD. Default: hoje.",
187
+ },
188
+ },
189
+ additionalProperties: false,
190
+ },
191
+ handler: async (call, args) => {
192
+ const res = await call("GET", `/tasks${qs({ date: args.date })}`);
193
+ return textFrom(res, "Nenhuma tarefa encontrada.");
194
+ },
195
+ }),
196
+ defineTool({
197
+ name: "lancar_despesa",
198
+ description: "Lança uma despesa (saída de dinheiro) nas finanças do ZeroSync.",
199
+ schema: transacaoSchema,
200
+ inputSchema: {
201
+ type: "object",
202
+ properties: {
203
+ amount: { type: "number", description: "Valor da despesa (positivo)." },
204
+ description: { type: "string", description: "Descrição da despesa." },
205
+ category: {
206
+ type: "string",
207
+ description: "Categoria (aproximada; será resolvida).",
208
+ },
209
+ account: {
210
+ type: "string",
211
+ description: "Conta de origem (aproximada; será resolvida).",
212
+ },
213
+ date: { type: "string", description: "Data AAAA-MM-DD. Default: hoje." },
214
+ },
215
+ required: ["amount", "description"],
216
+ additionalProperties: false,
217
+ },
218
+ handler: async (call, args) => {
219
+ const res = await call("POST", "/transactions", {
220
+ type: "expense",
221
+ ...clean(args),
222
+ });
223
+ return textFrom(res, "Despesa lançada.");
224
+ },
225
+ }),
226
+ defineTool({
227
+ name: "lancar_receita",
228
+ description: "Lança uma receita (entrada de dinheiro) nas finanças do ZeroSync.",
229
+ schema: transacaoSchema,
230
+ inputSchema: {
231
+ type: "object",
232
+ properties: {
233
+ amount: { type: "number", description: "Valor da receita (positivo)." },
234
+ description: { type: "string", description: "Descrição da receita." },
235
+ category: {
236
+ type: "string",
237
+ description: "Categoria (aproximada; será resolvida).",
238
+ },
239
+ account: {
240
+ type: "string",
241
+ description: "Conta de destino (aproximada; será resolvida).",
242
+ },
243
+ date: { type: "string", description: "Data AAAA-MM-DD. Default: hoje." },
244
+ },
245
+ required: ["amount", "description"],
246
+ additionalProperties: false,
247
+ },
248
+ handler: async (call, args) => {
249
+ const res = await call("POST", "/transactions", {
250
+ type: "income",
251
+ ...clean(args),
252
+ });
253
+ return textFrom(res, "Receita lançada.");
254
+ },
255
+ }),
256
+ defineTool({
257
+ name: "resumo_financeiro",
258
+ description: "Resumo financeiro do mês: entradas, saídas, líquido e saldo das contas.",
259
+ schema: resumoFinanceiroSchema,
260
+ inputSchema: {
261
+ type: "object",
262
+ properties: {
263
+ month: {
264
+ type: "string",
265
+ description: "Mês AAAA-MM. Default: mês atual.",
266
+ },
267
+ },
268
+ additionalProperties: false,
269
+ },
270
+ handler: async (call, args) => {
271
+ const res = await call("GET", `/finance/summary${qs({ month: args.month })}`);
272
+ return textFrom(res, "Sem dados financeiros para o período.");
273
+ },
274
+ }),
275
+ defineTool({
276
+ name: "marcar_habito",
277
+ description: "Marca um hábito como feito no ZeroSync (registra o cumprimento do dia).",
278
+ schema: marcarHabitoSchema,
279
+ inputSchema: {
280
+ type: "object",
281
+ properties: {
282
+ habit_name: {
283
+ type: "string",
284
+ description: "Nome do hábito (aproximado; será resolvido).",
285
+ },
286
+ quantity: {
287
+ type: "number",
288
+ description: "Quantidade registrada (ex: 8 copos). Opcional.",
289
+ },
290
+ date: { type: "string", description: "Data AAAA-MM-DD. Default: hoje." },
291
+ },
292
+ required: ["habit_name"],
293
+ additionalProperties: false,
294
+ },
295
+ handler: async (call, args) => {
296
+ const res = await call("POST", "/habits/log", clean(args));
297
+ return textFrom(res, `Hábito "${args.habit_name}" marcado.`);
298
+ },
299
+ }),
300
+ defineTool({
301
+ name: "listar_habitos",
302
+ description: "Lista os hábitos do ZeroSync e quais já foram cumpridos no dia.",
303
+ schema: listarHabitosSchema,
304
+ inputSchema: {
305
+ type: "object",
306
+ properties: {
307
+ date: {
308
+ type: "string",
309
+ description: "Data AAAA-MM-DD para o status do dia. Default: hoje.",
310
+ },
311
+ },
312
+ additionalProperties: false,
313
+ },
314
+ handler: async (call, args) => {
315
+ const res = await call("GET", `/habits${qs({ date: args.date })}`);
316
+ return textFrom(res, "Nenhum hábito cadastrado.");
317
+ },
318
+ }),
319
+ defineTool({
320
+ name: "add_compra",
321
+ description: "Adiciona um item à lista de compras/desejos do ZeroSync (com horizonte de prazo).",
322
+ schema: addCompraSchema,
323
+ inputSchema: {
324
+ type: "object",
325
+ properties: {
326
+ title: { type: "string", description: "O que comprar." },
327
+ horizon: {
328
+ type: "string",
329
+ enum: ["short", "medium", "long"],
330
+ description: "Horizonte: short (curto), medium, long. Default: short.",
331
+ },
332
+ quantity: { type: "integer", description: "Quantidade. Opcional." },
333
+ estimated_price: {
334
+ type: "number",
335
+ description: "Preço estimado. Opcional.",
336
+ },
337
+ category: { type: "string", description: "Categoria. Opcional." },
338
+ notes: { type: "string", description: "Observações. Opcional." },
339
+ },
340
+ required: ["title"],
341
+ additionalProperties: false,
342
+ },
343
+ handler: async (call, args) => {
344
+ const res = await call("POST", "/shopping", clean(args));
345
+ return textFrom(res, `Compra "${args.title}" adicionada à lista.`);
346
+ },
347
+ }),
348
+ defineTool({
349
+ name: "criar_objetivo",
350
+ description: "Cria um objetivo/meta no ZeroSync (com horizonte e data alvo opcional).",
351
+ schema: criarObjetivoSchema,
352
+ inputSchema: {
353
+ type: "object",
354
+ properties: {
355
+ title: { type: "string", description: "Título do objetivo." },
356
+ description: { type: "string", description: "Descrição. Opcional." },
357
+ horizon: {
358
+ type: "string",
359
+ enum: ["short", "medium", "long"],
360
+ description: "Horizonte. Default: medium.",
361
+ },
362
+ target_date: {
363
+ type: "string",
364
+ description: "Data alvo AAAA-MM-DD. Opcional.",
365
+ },
366
+ },
367
+ required: ["title"],
368
+ additionalProperties: false,
369
+ },
370
+ handler: async (call, args) => {
371
+ const res = await call("POST", "/goals", clean(args));
372
+ return textFrom(res, `Objetivo "${args.title}" criado.`);
373
+ },
374
+ }),
375
+ defineTool({
376
+ name: "add_nota",
377
+ description: "Adiciona uma nota/registro de diário (journal, gratidão ou reflexão) no ZeroSync.",
378
+ schema: addNotaSchema,
379
+ inputSchema: {
380
+ type: "object",
381
+ properties: {
382
+ content: { type: "string", description: "Conteúdo da nota." },
383
+ title: { type: "string", description: "Título. Opcional." },
384
+ date: { type: "string", description: "Data AAAA-MM-DD. Default: hoje." },
385
+ type: {
386
+ type: "string",
387
+ enum: ["journal", "gratidao", "reflexao"],
388
+ description: "Tipo da nota. Default: journal.",
389
+ },
390
+ mood: {
391
+ type: "integer",
392
+ description: "Humor de 1 a 5. Opcional.",
393
+ },
394
+ tags: {
395
+ type: "array",
396
+ items: { type: "string" },
397
+ description: "Tags. Opcional.",
398
+ },
399
+ },
400
+ required: ["content"],
401
+ additionalProperties: false,
402
+ },
403
+ handler: async (call, args) => {
404
+ const res = await call("POST", "/notes", clean(args));
405
+ return textFrom(res, "Nota adicionada.");
406
+ },
407
+ }),
408
+ ];
409
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "zerosync-mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server (stdio) que expõe as ações do ZeroSync via API REST v1. Autentica com um Personal Access Token (PAT).",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "keywords": [
8
+ "mcp",
9
+ "model-context-protocol",
10
+ "zerosync",
11
+ "agenda",
12
+ "finance",
13
+ "habits",
14
+ "assistant"
15
+ ],
16
+ "homepage": "https://app.zerosync.com.br/docs",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/pablosantosia/ZeroSync.git",
20
+ "directory": "packages/zerosync-mcp"
21
+ },
22
+ "bin": {
23
+ "zerosync-mcp": "dist/index.js"
24
+ },
25
+ "files": [
26
+ "dist",
27
+ "README.md"
28
+ ],
29
+ "engines": {
30
+ "node": ">=18"
31
+ },
32
+ "scripts": {
33
+ "build": "tsc",
34
+ "start": "node dist/index.js",
35
+ "dev": "tsx src/index.ts",
36
+ "typecheck": "tsc --noEmit",
37
+ "prepublishOnly": "npm run build"
38
+ },
39
+ "dependencies": {
40
+ "@modelcontextprotocol/sdk": "^1.0.0",
41
+ "zod": "^3.24.1"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^22.10.0",
45
+ "tsx": "^4.19.0",
46
+ "typescript": "^5.7.3"
47
+ }
48
+ }