flowmind-mcp 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/config.ts","../../src/client.ts","../../src/utils.ts","../../src/tools/goals.ts","../../src/tools/tasks.ts","../../src/tools/notes.ts","../../src/tools/people.ts","../../src/tools/tags.ts"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { loadConfig } from './config.js'\nimport { FlowMindClient } from './client.js'\nimport { registerGoalTools } from './tools/goals.js'\nimport { registerTaskTools } from './tools/tasks.js'\nimport { registerNoteTools } from './tools/notes.js'\nimport { registerPeopleTools } from './tools/people.js'\nimport { registerTagTools } from './tools/tags.js'\n\nconst config = loadConfig()\nconst client = new FlowMindClient(config)\n\nconst server = new McpServer({\n name: 'flowmind',\n version: '1.0.0',\n})\n\nregisterGoalTools(server, client)\nregisterTaskTools(server, client)\nregisterNoteTools(server, client)\nregisterPeopleTools(server, client)\nregisterTagTools(server, client)\n\nconst transport = new StdioServerTransport()\nawait server.connect(transport)\n","import { readFileSync } from 'fs'\nimport { join } from 'path'\nimport { homedir } from 'os'\n\nexport interface Config {\n apiKey: string\n baseUrl: string\n}\n\nexport function loadConfig(): Config {\n // Priority 1: Environment variables\n const envKey = process.env.FLOWMIND_API_KEY\n const envUrl = process.env.FLOWMIND_BASE_URL\n\n if (envKey) {\n return {\n apiKey: envKey,\n baseUrl: envUrl || 'https://flowmind.life/api/v1',\n }\n }\n\n // Priority 2: Config file (~/.flowmind/config.json)\n try {\n const configPath = join(homedir(), '.flowmind', 'config.json')\n const raw = readFileSync(configPath, 'utf-8')\n const config = JSON.parse(raw) as { api_key?: string; base_url?: string }\n\n if (config.api_key) {\n return {\n apiKey: config.api_key,\n baseUrl: config.base_url || 'https://flowmind.life/api/v1',\n }\n }\n } catch {\n // Config file not found or invalid, fall through\n }\n\n throw new Error(\n 'FlowMind API key not configured.\\n' +\n 'Set FLOWMIND_API_KEY environment variable, or create ~/.flowmind/config.json:\\n' +\n '{\"api_key\": \"fm_xxx\", \"base_url\": \"https://flowmind.life/api/v1\"}'\n )\n}\n","import { readFileSync } from 'fs'\nimport type { Config } from './config.js'\nimport type {\n Goal, Task, Note, NoteImage, Person, Tag,\n PaginatedResponse, SingleResponse, ApiError,\n} from './types.js'\nimport { buildQueryString } from './utils.js'\n\nexport class FlowMindClient {\n private apiKey: string\n private baseUrl: string\n\n constructor(config: Config) {\n this.apiKey = config.apiKey\n this.baseUrl = config.baseUrl.replace(/\\/$/, '')\n }\n\n private async request<T>(method: string, path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.apiKey}`,\n }\n\n const init: RequestInit = { method, headers }\n\n if (body !== undefined) {\n headers['Content-Type'] = 'application/json'\n init.body = JSON.stringify(body)\n }\n\n const res = await fetch(url, init)\n\n if (res.status === 204) {\n return undefined as T\n }\n\n const json = await res.json()\n\n if (!res.ok) {\n const apiErr = json as ApiError\n const msg = apiErr.error?.message || `API error ${res.status}`\n throw new Error(msg)\n }\n\n return json as T\n }\n\n // ── Goals ──\n\n async listGoals(params: Record<string, unknown> = {}): Promise<PaginatedResponse<Goal>> {\n return this.request('GET', `/goals${buildQueryString(params)}`)\n }\n\n async getGoal(id: string): Promise<SingleResponse<Goal>> {\n return this.request('GET', `/goals/${id}`)\n }\n\n async createGoal(data: Record<string, unknown>): Promise<SingleResponse<Goal>> {\n return this.request('POST', '/goals', data)\n }\n\n async updateGoal(id: string, data: Record<string, unknown>): Promise<SingleResponse<Goal>> {\n return this.request('PATCH', `/goals/${id}`, data)\n }\n\n async deleteGoal(id: string): Promise<void> {\n await this.request('DELETE', `/goals/${id}`)\n }\n\n async listGoalTasks(goalId: string, params: Record<string, unknown> = {}): Promise<PaginatedResponse<Task>> {\n return this.request('GET', `/goals/${goalId}/tasks${buildQueryString(params)}`)\n }\n\n // ── Tasks ──\n\n async listTasks(params: Record<string, unknown> = {}): Promise<PaginatedResponse<Task>> {\n return this.request('GET', `/tasks${buildQueryString(params)}`)\n }\n\n async getTask(id: string): Promise<SingleResponse<Task>> {\n return this.request('GET', `/tasks/${id}`)\n }\n\n async createTask(data: Record<string, unknown>): Promise<SingleResponse<Task>> {\n return this.request('POST', '/tasks', data)\n }\n\n async updateTask(id: string, data: Record<string, unknown>): Promise<SingleResponse<Task>> {\n return this.request('PATCH', `/tasks/${id}`, data)\n }\n\n async deleteTask(id: string): Promise<void> {\n await this.request('DELETE', `/tasks/${id}`)\n }\n\n async listSubtasks(parentId: string, params: Record<string, unknown> = {}): Promise<PaginatedResponse<Task>> {\n return this.request('GET', `/tasks/${parentId}/subtasks${buildQueryString(params)}`)\n }\n\n async createSubtask(parentId: string, data: Record<string, unknown>): Promise<SingleResponse<Task>> {\n return this.request('POST', `/tasks/${parentId}/subtasks`, data)\n }\n\n // ── Notes ──\n\n async listNotes(params: Record<string, unknown> = {}): Promise<PaginatedResponse<Note>> {\n return this.request('GET', `/notes${buildQueryString(params)}`)\n }\n\n async getNote(id: string): Promise<SingleResponse<Note>> {\n return this.request('GET', `/notes/${id}`)\n }\n\n async createNote(data: Record<string, unknown>): Promise<SingleResponse<Note>> {\n return this.request('POST', '/notes', data)\n }\n\n async updateNote(id: string, data: Record<string, unknown>): Promise<SingleResponse<Note>> {\n return this.request('PATCH', `/notes/${id}`, data)\n }\n\n async deleteNote(id: string): Promise<void> {\n await this.request('DELETE', `/notes/${id}`)\n }\n\n // ── Note Images ──\n\n async listNoteImages(noteId: string, params: Record<string, unknown> = {}): Promise<PaginatedResponse<NoteImage>> {\n return this.request('GET', `/notes/${noteId}/images${buildQueryString(params)}`)\n }\n\n async uploadNoteImage(noteId: string, filePath: string, placeholderId?: string, alt?: string): Promise<SingleResponse<NoteImage>> {\n const url = `${this.baseUrl}/notes/${noteId}/images`\n const fileBuffer = readFileSync(filePath)\n const fileName = filePath.split('/').pop() || 'image.png'\n const ext = fileName.split('.').pop()?.toLowerCase() || 'png'\n\n const mimeMap: Record<string, string> = {\n jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png',\n gif: 'image/gif', webp: 'image/webp',\n }\n const mimeType = mimeMap[ext] || 'image/png'\n\n const formData = new FormData()\n formData.append('file', new Blob([fileBuffer], { type: mimeType }), fileName)\n if (placeholderId) formData.append('placeholder_id', placeholderId)\n if (alt) formData.append('alt', alt)\n\n const res = await fetch(url, {\n method: 'POST',\n headers: { 'Authorization': `Bearer ${this.apiKey}` },\n body: formData,\n })\n\n const json = await res.json()\n if (!res.ok) {\n const apiErr = json as ApiError\n throw new Error(apiErr.error?.message || `Upload failed: ${res.status}`)\n }\n return json as SingleResponse<NoteImage>\n }\n\n async deleteNoteImage(noteId: string, imageId: string): Promise<void> {\n await this.request('DELETE', `/notes/${noteId}/images/${imageId}`)\n }\n\n // ── People ──\n\n async listPeople(params: Record<string, unknown> = {}): Promise<PaginatedResponse<Person>> {\n return this.request('GET', `/people${buildQueryString(params)}`)\n }\n\n async getPerson(id: string): Promise<SingleResponse<Person>> {\n return this.request('GET', `/people/${id}`)\n }\n\n async createPerson(data: Record<string, unknown>): Promise<SingleResponse<Person>> {\n return this.request('POST', '/people', data)\n }\n\n async updatePerson(id: string, data: Record<string, unknown>): Promise<SingleResponse<Person>> {\n return this.request('PATCH', `/people/${id}`, data)\n }\n\n async deletePerson(id: string): Promise<void> {\n await this.request('DELETE', `/people/${id}`)\n }\n\n async listPersonTags(personId: string): Promise<SingleResponse<Tag[]>> {\n return this.request('GET', `/people/${personId}/tags`)\n }\n\n async addPersonTag(personId: string, tagId: string): Promise<SingleResponse<Tag>> {\n return this.request('POST', `/people/${personId}/tags`, { tag_id: tagId })\n }\n\n async removePersonTag(personId: string, tagId: string): Promise<void> {\n await this.request('DELETE', `/people/${personId}/tags/${tagId}`)\n }\n\n // ── Tags ──\n\n async listTags(params: Record<string, unknown> = {}): Promise<PaginatedResponse<Tag>> {\n return this.request('GET', `/tags${buildQueryString(params)}`)\n }\n\n async getTag(id: string): Promise<SingleResponse<Tag>> {\n return this.request('GET', `/tags/${id}`)\n }\n\n async createTag(data: Record<string, unknown>): Promise<SingleResponse<Tag>> {\n return this.request('POST', '/tags', data)\n }\n\n async updateTag(id: string, data: Record<string, unknown>): Promise<SingleResponse<Tag>> {\n return this.request('PATCH', `/tags/${id}`, data)\n }\n\n async deleteTag(id: string): Promise<void> {\n await this.request('DELETE', `/tags/${id}`)\n }\n}\n","import type { PaginatedResponse, SingleResponse } from './types.js'\n\nexport function formatList<T>(result: PaginatedResponse<T>): string {\n const { data, meta } = result\n const { pagination } = meta\n const header = `Showing ${data.length} of ${pagination.total} (page ${pagination.page}/${pagination.totalPages})`\n return `${header}\\n\\n${JSON.stringify(data, null, 2)}`\n}\n\nexport function formatItem<T>(result: SingleResponse<T>): string {\n return JSON.stringify(result.data, null, 2)\n}\n\nexport function formatCreated<T extends { id?: string }>(result: SingleResponse<T>, label: string): string {\n const id = result.data.id || ''\n return `${label} created (ID: ${id})\\n\\n${JSON.stringify(result.data, null, 2)}`\n}\n\nexport function formatUpdated<T>(result: SingleResponse<T>, label: string): string {\n return `${label} updated\\n\\n${JSON.stringify(result.data, null, 2)}`\n}\n\nexport function formatDeleted(label: string): string {\n return `${label} deleted successfully`\n}\n\nexport function buildQueryString(params: Record<string, unknown>): string {\n const qs = new URLSearchParams()\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value))\n }\n }\n const str = qs.toString()\n return str ? `?${str}` : ''\n}\n\nexport function toolResult(text: string, isError = false) {\n return {\n content: [{ type: 'text' as const, text }],\n ...(isError ? { isError: true } : {}),\n }\n}\n\nexport function errorResult(err: unknown) {\n const message = err instanceof Error ? err.message : String(err)\n return toolResult(`Error: ${message}`, true)\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport type { FlowMindClient } from '../client.js'\nimport { formatList, formatItem, formatCreated, formatUpdated, formatDeleted, toolResult, errorResult } from '../utils.js'\n\nexport function registerGoalTools(server: McpServer, client: FlowMindClient) {\n server.tool(\n 'list_goals',\n 'List goals with optional filters for status, category, and pinned state. Returns paginated results.',\n {\n status: z.enum(['active', 'completed', 'archived']).optional().describe('Filter by goal status'),\n category: z.enum(['business', 'career', 'health', 'personal', 'learning', 'financial']).optional().describe('Filter by category'),\n pinned: z.boolean().optional().describe('Filter by pinned state'),\n sort: z.enum(['created_at', 'updated_at', 'title', 'target_date', 'progress']).optional().describe('Sort field'),\n order: z.enum(['asc', 'desc']).optional().describe('Sort direction'),\n page: z.number().int().min(1).optional().describe('Page number'),\n limit: z.number().int().min(1).max(100).optional().describe('Items per page'),\n },\n async (params) => {\n try {\n const result = await client.listGoals(params)\n return toolResult(formatList(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'get_goal',\n 'Get the details of a specific goal by its ID.',\n { id: z.string().describe('Goal ID (UUID)') },\n async ({ id }) => {\n try {\n const result = await client.getGoal(id)\n return toolResult(formatItem(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'create_goal',\n 'Create a new goal. Goals help you organize tasks under high-level objectives.',\n {\n title: z.string().describe('Goal title (required)'),\n description: z.string().optional().describe('Goal description'),\n category: z.enum(['business', 'career', 'health', 'personal', 'learning', 'financial']).optional().describe('Category'),\n target_date: z.string().optional().describe('Target date (YYYY-MM-DD)'),\n status: z.enum(['active', 'completed', 'archived']).optional().describe('Status'),\n progress: z.number().int().min(0).max(100).optional().describe('Progress percentage (0-100)'),\n pinned: z.boolean().optional().describe('Pin this goal'),\n },\n async (params) => {\n try {\n const result = await client.createGoal(params)\n return toolResult(formatCreated(result, 'Goal'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'update_goal',\n 'Update one or more fields on an existing goal.',\n {\n id: z.string().describe('Goal ID (UUID)'),\n title: z.string().optional().describe('New title'),\n description: z.string().optional().describe('New description'),\n category: z.enum(['business', 'career', 'health', 'personal', 'learning', 'financial']).optional(),\n target_date: z.string().optional().describe('New target date (YYYY-MM-DD)'),\n status: z.enum(['active', 'completed', 'archived']).optional(),\n progress: z.number().int().min(0).max(100).optional(),\n pinned: z.boolean().optional(),\n },\n async ({ id, ...data }) => {\n try {\n const result = await client.updateGoal(id, data)\n return toolResult(formatUpdated(result, 'Goal'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'delete_goal',\n 'Permanently delete a goal. Associated tasks are unlinked, not deleted.',\n { id: z.string().describe('Goal ID (UUID)') },\n async ({ id }) => {\n try {\n await client.deleteGoal(id)\n return toolResult(formatDeleted('Goal'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'list_goal_tasks',\n 'List all tasks associated with a specific goal.',\n {\n goal_id: z.string().describe('Goal ID (UUID)'),\n status: z.enum(['todo', 'in_progress', 'completed', 'archived']).optional(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n page: z.number().int().min(1).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n },\n async ({ goal_id, ...params }) => {\n try {\n const result = await client.listGoalTasks(goal_id, params)\n return toolResult(formatList(result))\n } catch (err) { return errorResult(err) }\n }\n )\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport type { FlowMindClient } from '../client.js'\nimport { formatList, formatItem, formatCreated, formatUpdated, formatDeleted, toolResult, errorResult } from '../utils.js'\n\nexport function registerTaskTools(server: McpServer, client: FlowMindClient) {\n server.tool(\n 'list_tasks',\n 'List tasks with optional filters. Supports filtering by status, priority, energy level, goal, person, due date range, and focus state.',\n {\n status: z.enum(['todo', 'in_progress', 'completed', 'archived']).optional(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n energy_level: z.enum(['low', 'medium', 'high']).optional(),\n goal_id: z.string().optional().describe('Filter by goal ID'),\n person_id: z.string().optional().describe('Filter by person ID'),\n parent_task_id: z.string().optional().describe('Filter by parent task. Use \"null\" for root tasks only.'),\n due_date_from: z.string().optional().describe('Due date from (YYYY-MM-DD)'),\n due_date_to: z.string().optional().describe('Due date to (YYYY-MM-DD)'),\n pinned: z.boolean().optional(),\n focused: z.boolean().optional(),\n focus_today: z.boolean().optional(),\n sort: z.enum(['created_at', 'updated_at', 'due_date', 'priority', 'title']).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n page: z.number().int().min(1).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n },\n async (params) => {\n try {\n const result = await client.listTasks(params)\n return toolResult(formatList(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'get_task',\n 'Get the details of a specific task including priority, energy level, due date, and linked goal/person.',\n { id: z.string().describe('Task ID (UUID)') },\n async ({ id }) => {\n try {\n const result = await client.getTask(id)\n return toolResult(formatItem(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'create_task',\n 'Create a new task. Tasks can be linked to goals, assigned to people, and organized with priorities and due dates.',\n {\n title: z.string().describe('Task title (required)'),\n description: z.string().optional(),\n status: z.enum(['todo', 'in_progress', 'completed', 'archived']).optional(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n energy_level: z.enum(['low', 'medium', 'high']).optional(),\n due_date: z.string().optional().describe('Due date (YYYY-MM-DD)'),\n goal_id: z.string().optional().describe('Link to a goal'),\n person_id: z.string().optional().describe('Assign to a person'),\n estimated_minutes: z.number().int().optional(),\n pinned: z.boolean().optional(),\n focus_today: z.boolean().optional(),\n },\n async (params) => {\n try {\n const result = await client.createTask(params)\n return toolResult(formatCreated(result, 'Task'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'update_task',\n 'Update one or more fields on an existing task.',\n {\n id: z.string().describe('Task ID (UUID)'),\n title: z.string().optional(),\n description: z.string().optional(),\n status: z.enum(['todo', 'in_progress', 'completed', 'archived']).optional(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n energy_level: z.enum(['low', 'medium', 'high']).optional(),\n due_date: z.string().optional(),\n goal_id: z.string().nullable().optional(),\n person_id: z.string().nullable().optional(),\n estimated_minutes: z.number().int().nullable().optional(),\n pinned: z.boolean().optional(),\n focused: z.boolean().optional(),\n focus_today: z.boolean().optional(),\n },\n async ({ id, ...data }) => {\n try {\n const result = await client.updateTask(id, data)\n return toolResult(formatUpdated(result, 'Task'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'delete_task',\n 'Permanently delete a task and all its subtasks.',\n { id: z.string().describe('Task ID (UUID)') },\n async ({ id }) => {\n try {\n await client.deleteTask(id)\n return toolResult(formatDeleted('Task'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'list_subtasks',\n 'List subtasks (child tasks) for a specific parent task.',\n {\n parent_task_id: z.string().describe('Parent task ID (UUID)'),\n page: z.number().int().min(1).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n },\n async ({ parent_task_id, ...params }) => {\n try {\n const result = await client.listSubtasks(parent_task_id, params)\n return toolResult(formatList(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'create_subtask',\n 'Create a new subtask under the specified parent task.',\n {\n parent_task_id: z.string().describe('Parent task ID (UUID)'),\n title: z.string().describe('Subtask title (required)'),\n description: z.string().optional(),\n priority: z.enum(['low', 'medium', 'high', 'urgent']).optional(),\n energy_level: z.enum(['low', 'medium', 'high']).optional(),\n due_date: z.string().optional(),\n estimated_minutes: z.number().int().optional(),\n },\n async ({ parent_task_id, ...data }) => {\n try {\n const result = await client.createSubtask(parent_task_id, data)\n return toolResult(formatCreated(result, 'Subtask'))\n } catch (err) { return errorResult(err) }\n }\n )\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport type { FlowMindClient } from '../client.js'\nimport { formatList, formatItem, formatCreated, formatUpdated, formatDeleted, toolResult, errorResult } from '../utils.js'\n\nexport function registerNoteTools(server: McpServer, client: FlowMindClient) {\n server.tool(\n 'list_notes',\n 'List notes with optional filters. Note content with embedded images will have signed URLs automatically refreshed.',\n {\n category: z.string().optional().describe('Filter by category'),\n task_id: z.string().optional().describe('Filter by linked task ID'),\n pinned: z.boolean().optional(),\n sort: z.enum(['created_at', 'updated_at', 'title']).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n page: z.number().int().min(1).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n },\n async (params) => {\n try {\n const result = await client.listNotes(params)\n return toolResult(formatList(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'get_note',\n 'Get a note by ID. Embedded image URLs are automatically refreshed.',\n { id: z.string().describe('Note ID (UUID)') },\n async ({ id }) => {\n try {\n const result = await client.getNote(id)\n return toolResult(formatItem(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'create_note',\n 'Create a new note. Content can include {{IMG:placeholder_id}} markers for image insertion — upload images via upload_note_image to replace them.',\n {\n title: z.string().describe('Note title (required)'),\n content: z.string().optional().describe('Note content (supports Markdown and {{IMG:id}} placeholders)'),\n category: z.string().optional(),\n task_id: z.string().optional().describe('Link to a task'),\n is_protected: z.boolean().optional(),\n pinned: z.boolean().optional(),\n },\n async (params) => {\n try {\n const result = await client.createNote(params)\n return toolResult(formatCreated(result, 'Note'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'update_note',\n 'Update one or more fields on an existing note. Existing embedded images are preserved.',\n {\n id: z.string().describe('Note ID (UUID)'),\n title: z.string().optional(),\n content: z.string().optional(),\n category: z.string().nullable().optional(),\n task_id: z.string().nullable().optional(),\n is_protected: z.boolean().optional(),\n pinned: z.boolean().optional(),\n },\n async ({ id, ...data }) => {\n try {\n const result = await client.updateNote(id, data)\n return toolResult(formatUpdated(result, 'Note'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'delete_note',\n 'Permanently delete a note and all its image attachments.',\n { id: z.string().describe('Note ID (UUID)') },\n async ({ id }) => {\n try {\n await client.deleteNote(id)\n return toolResult(formatDeleted('Note'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n // ── Note Images ──\n\n server.tool(\n 'list_note_images',\n 'List image attachments for a note, each with a fresh signed URL.',\n {\n note_id: z.string().describe('Note ID (UUID)'),\n page: z.number().int().min(1).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n },\n async ({ note_id, ...params }) => {\n try {\n const result = await client.listNoteImages(note_id, params)\n return toolResult(formatList(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'upload_note_image',\n 'Upload an image to a note. If placeholder_id matches a {{IMG:id}} marker in note content, it is replaced with an <img> tag. Max 25MB, JPEG/PNG/GIF/WebP.',\n {\n note_id: z.string().describe('Note ID (UUID)'),\n file_path: z.string().describe('Local path to the image file'),\n placeholder_id: z.string().optional().describe('Placeholder ID to replace in note content'),\n alt: z.string().optional().describe('Alt text for the image'),\n },\n async ({ note_id, file_path, placeholder_id, alt }) => {\n try {\n const result = await client.uploadNoteImage(note_id, file_path, placeholder_id, alt)\n const data = result.data\n const status = data.replaced ? 'uploaded and placeholder replaced' : 'uploaded as attachment'\n return toolResult(`Image ${status} (ID: ${data.id})\\n\\n${JSON.stringify(data, null, 2)}`)\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'delete_note_image',\n 'Delete an image attachment and remove its <img> tag from note content.',\n {\n note_id: z.string().describe('Note ID (UUID)'),\n image_id: z.string().describe('Image attachment ID (UUID)'),\n },\n async ({ note_id, image_id }) => {\n try {\n await client.deleteNoteImage(note_id, image_id)\n return toolResult(formatDeleted('Note image'))\n } catch (err) { return errorResult(err) }\n }\n )\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport type { FlowMindClient } from '../client.js'\nimport { formatList, formatItem, formatCreated, formatUpdated, formatDeleted, toolResult, errorResult } from '../utils.js'\n\nexport function registerPeopleTools(server: McpServer, client: FlowMindClient) {\n server.tool(\n 'list_people',\n 'List contacts with optional filters for relationship type, tag, or search.',\n {\n relationship_type: z.enum(['business', 'colleague', 'friend', 'family', 'mentor', 'client', 'partner', 'other']).optional(),\n tag_id: z.string().optional().describe('Filter by tag ID'),\n search: z.string().optional().describe('Search by name, email, or company'),\n sort: z.enum(['created_at', 'updated_at', 'name']).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n page: z.number().int().min(1).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n },\n async (params) => {\n try {\n const result = await client.listPeople(params)\n return toolResult(formatList(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'get_person',\n 'Get the details of a specific person by their ID.',\n { id: z.string().describe('Person ID (UUID)') },\n async ({ id }) => {\n try {\n const result = await client.getPerson(id)\n return toolResult(formatItem(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'create_person',\n 'Create a new contact. People can be linked to tasks and tagged for organization.',\n {\n name: z.string().describe('Person name (required)'),\n email: z.string().optional(),\n phone: z.string().optional(),\n company: z.string().optional(),\n role: z.string().optional().describe('Job title'),\n relationship_type: z.enum(['business', 'colleague', 'friend', 'family', 'mentor', 'client', 'partner', 'other']).optional(),\n notes: z.string().optional(),\n location: z.string().optional(),\n birthday: z.string().optional().describe('Birthday (YYYY-MM-DD)'),\n },\n async (params) => {\n try {\n const result = await client.createPerson(params)\n return toolResult(formatCreated(result, 'Person'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'update_person',\n 'Update one or more fields on an existing person.',\n {\n id: z.string().describe('Person ID (UUID)'),\n name: z.string().optional(),\n email: z.string().nullable().optional(),\n phone: z.string().nullable().optional(),\n company: z.string().nullable().optional(),\n role: z.string().nullable().optional(),\n relationship_type: z.enum(['business', 'colleague', 'friend', 'family', 'mentor', 'client', 'partner', 'other']).optional(),\n notes: z.string().nullable().optional(),\n location: z.string().nullable().optional(),\n },\n async ({ id, ...data }) => {\n try {\n const result = await client.updatePerson(id, data)\n return toolResult(formatUpdated(result, 'Person'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'delete_person',\n 'Permanently delete a person and remove all their tag associations.',\n { id: z.string().describe('Person ID (UUID)') },\n async ({ id }) => {\n try {\n await client.deletePerson(id)\n return toolResult(formatDeleted('Person'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n // ── Person Tags ──\n\n server.tool(\n 'list_person_tags',\n 'List all tags assigned to a specific person.',\n { person_id: z.string().describe('Person ID (UUID)') },\n async ({ person_id }) => {\n try {\n const result = await client.listPersonTags(person_id)\n return toolResult(JSON.stringify(result.data, null, 2))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'add_person_tag',\n 'Assign an existing tag to a person. Returns 409 if already assigned.',\n {\n person_id: z.string().describe('Person ID (UUID)'),\n tag_id: z.string().describe('Tag ID (UUID)'),\n },\n async ({ person_id, tag_id }) => {\n try {\n const result = await client.addPersonTag(person_id, tag_id)\n return toolResult(`Tag assigned\\n\\n${JSON.stringify(result.data, null, 2)}`)\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'remove_person_tag',\n 'Remove a tag from a person. The tag itself is not deleted.',\n {\n person_id: z.string().describe('Person ID (UUID)'),\n tag_id: z.string().describe('Tag ID (UUID)'),\n },\n async ({ person_id, tag_id }) => {\n try {\n await client.removePersonTag(person_id, tag_id)\n return toolResult('Tag removed from person')\n } catch (err) { return errorResult(err) }\n }\n )\n}\n","import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport { z } from 'zod'\nimport type { FlowMindClient } from '../client.js'\nimport { formatList, formatItem, formatCreated, formatUpdated, formatDeleted, toolResult, errorResult } from '../utils.js'\n\nexport function registerTagTools(server: McpServer, client: FlowMindClient) {\n server.tool(\n 'list_tags',\n 'List all tags. Tags are used to categorize people.',\n {\n sort: z.enum(['name', 'created_at']).optional(),\n order: z.enum(['asc', 'desc']).optional(),\n page: z.number().int().min(1).optional(),\n limit: z.number().int().min(1).max(100).optional(),\n },\n async (params) => {\n try {\n const result = await client.listTags(params)\n return toolResult(formatList(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'get_tag',\n 'Get the details of a specific tag by its ID.',\n { id: z.string().describe('Tag ID (UUID)') },\n async ({ id }) => {\n try {\n const result = await client.getTag(id)\n return toolResult(formatItem(result))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'create_tag',\n 'Create a new tag. Tag names must be unique — returns 409 if a tag with the same name exists.',\n {\n name: z.string().describe('Tag name (required, must be unique)'),\n color: z.string().optional().describe('Tag color (hex code, e.g. #ff0000)'),\n },\n async (params) => {\n try {\n const result = await client.createTag(params)\n return toolResult(formatCreated(result, 'Tag'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'update_tag',\n 'Update a tag name or color. Returns 409 if the new name conflicts with an existing tag.',\n {\n id: z.string().describe('Tag ID (UUID)'),\n name: z.string().optional(),\n color: z.string().optional(),\n },\n async ({ id, ...data }) => {\n try {\n const result = await client.updateTag(id, data)\n return toolResult(formatUpdated(result, 'Tag'))\n } catch (err) { return errorResult(err) }\n }\n )\n\n server.tool(\n 'delete_tag',\n 'Permanently delete a tag and remove it from all people.',\n { id: z.string().describe('Tag ID (UUID)') },\n async ({ id }) => {\n try {\n await client.deleteTag(id)\n return toolResult(formatDeleted('Tag'))\n } catch (err) { return errorResult(err) }\n }\n )\n}\n"],"mappings":"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","names":["config","readFileSync","config","readFileSync","server","client","z","server","client","z","z","server","client","z","z","server","client","z","z","server","client","z"]}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "flowmind-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP Server for FlowMind — manage goals, tasks, notes, people and tags from any MCP client",
5
+ "type": "module",
6
+ "bin": {
7
+ "flowmind-mcp": "dist/bin/flowmind-mcp.js"
8
+ },
9
+ "main": "./dist/src/index.js",
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsup",
15
+ "dev": "tsx bin/flowmind-mcp.ts",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "keywords": [
19
+ "mcp",
20
+ "flowmind",
21
+ "productivity",
22
+ "goals",
23
+ "tasks",
24
+ "notes",
25
+ "claude",
26
+ "model-context-protocol"
27
+ ],
28
+ "author": "haohappy",
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/haohappy/cc-skill-flowmind.git",
33
+ "directory": "mcp-server"
34
+ },
35
+ "homepage": "https://flowmind.life",
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "dependencies": {
40
+ "@modelcontextprotocol/sdk": "^1.12.0",
41
+ "zod": "^3.23.0"
42
+ },
43
+ "devDependencies": {
44
+ "@types/node": "^20.0.0",
45
+ "tsup": "^8.0.0",
46
+ "tsx": "^4.0.0",
47
+ "typescript": "^5.4.0"
48
+ }
49
+ }