@studiometa/productive-mcp 0.4.6 → 0.6.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 (63) hide show
  1. package/Dockerfile +7 -0
  2. package/README.md +160 -61
  3. package/dist/auth.d.ts.map +1 -1
  4. package/dist/auth.js.map +1 -1
  5. package/dist/crypto.js +1 -1
  6. package/dist/crypto.js.map +1 -1
  7. package/dist/formatters.d.ts +38 -8
  8. package/dist/formatters.d.ts.map +1 -1
  9. package/dist/handlers/bookings.d.ts +6 -0
  10. package/dist/handlers/bookings.d.ts.map +1 -0
  11. package/dist/handlers/comments.d.ts +6 -0
  12. package/dist/handlers/comments.d.ts.map +1 -0
  13. package/dist/handlers/companies.d.ts +6 -0
  14. package/dist/handlers/companies.d.ts.map +1 -0
  15. package/dist/handlers/deals.d.ts +6 -0
  16. package/dist/handlers/deals.d.ts.map +1 -0
  17. package/dist/handlers/index.d.ts +15 -0
  18. package/dist/handlers/index.d.ts.map +1 -0
  19. package/dist/handlers/people.d.ts +7 -0
  20. package/dist/handlers/people.d.ts.map +1 -0
  21. package/dist/handlers/projects.d.ts +6 -0
  22. package/dist/handlers/projects.d.ts.map +1 -0
  23. package/dist/handlers/services.d.ts +6 -0
  24. package/dist/handlers/services.d.ts.map +1 -0
  25. package/dist/handlers/tasks.d.ts +6 -0
  26. package/dist/handlers/tasks.d.ts.map +1 -0
  27. package/dist/handlers/time.d.ts +6 -0
  28. package/dist/handlers/time.d.ts.map +1 -0
  29. package/dist/handlers/timers.d.ts +6 -0
  30. package/dist/handlers/timers.d.ts.map +1 -0
  31. package/dist/handlers/types.d.ts +78 -0
  32. package/dist/handlers/types.d.ts.map +1 -0
  33. package/dist/handlers/utils.d.ts +17 -0
  34. package/dist/handlers/utils.d.ts.map +1 -0
  35. package/dist/handlers.d.ts +3 -12
  36. package/dist/handlers.d.ts.map +1 -1
  37. package/dist/handlers.js +2 -135
  38. package/dist/handlers.js.map +1 -1
  39. package/dist/http.js +3 -3
  40. package/dist/http.js.map +1 -1
  41. package/dist/index-CmTDkz-y.js +480 -0
  42. package/dist/index-CmTDkz-y.js.map +1 -0
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +1 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/oauth.d.ts +1 -1
  47. package/dist/oauth.d.ts.map +1 -1
  48. package/dist/oauth.js +111 -12
  49. package/dist/oauth.js.map +1 -1
  50. package/dist/server.d.ts.map +1 -1
  51. package/dist/server.js +2 -2
  52. package/dist/server.js.map +1 -1
  53. package/dist/stdio.d.ts.map +1 -1
  54. package/dist/stdio.js +1 -1
  55. package/dist/stdio.js.map +1 -1
  56. package/dist/tools.d.ts +3 -2
  57. package/dist/tools.d.ts.map +1 -1
  58. package/dist/tools.js +55 -193
  59. package/dist/tools.js.map +1 -1
  60. package/dist/version-BmTJXDFu.js +5 -0
  61. package/dist/{version-uWLfG4Z0.js.map → version-BmTJXDFu.js.map} +1 -1
  62. package/package.json +45 -45
  63. package/dist/version-uWLfG4Z0.js +0 -5
package/dist/tools.js CHANGED
@@ -1,219 +1,81 @@
1
1
  const TOOLS = [
2
2
  {
3
- name: "productive_list_projects",
4
- description: "List projects from Productive.io with optional filters",
3
+ name: "productive",
4
+ description: "Productive.io API. Resources: projects, time, tasks, services, people, companies, comments, timers, deals, bookings. Actions: list, get, create, update (varies by resource), start/stop (timers), me (people). Filters: project_id, person_id, service_id, company_id, after/before (dates).",
5
5
  inputSchema: {
6
6
  type: "object",
7
7
  properties: {
8
- filter: {
9
- type: "object",
10
- description: "Filters to apply",
11
- properties: {
12
- board_id: { type: "string", description: "Filter by board ID" },
13
- company_id: { type: "string", description: "Filter by company ID" },
14
- project_manager_id: { type: "string", description: "Filter by project manager ID" },
15
- workflow_status: { type: "string", description: "Filter by workflow status" }
16
- }
8
+ resource: {
9
+ type: "string",
10
+ enum: [
11
+ "projects",
12
+ "time",
13
+ "tasks",
14
+ "services",
15
+ "people",
16
+ "companies",
17
+ "comments",
18
+ "timers",
19
+ "deals",
20
+ "bookings"
21
+ ]
17
22
  },
18
- page: { type: "number", description: "Page number (default: 1)" },
19
- per_page: { type: "number", description: "Items per page (default: 50, max: 200)" }
20
- }
21
- }
22
- },
23
- {
24
- name: "productive_get_project",
25
- description: "Get details for a specific project by ID",
26
- inputSchema: {
27
- type: "object",
28
- properties: {
29
- id: { type: "string", description: "Project ID" }
30
- },
31
- required: ["id"]
32
- }
33
- },
34
- {
35
- name: "productive_list_time_entries",
36
- description: "List time entries with optional filters",
37
- inputSchema: {
38
- type: "object",
39
- properties: {
40
- filter: {
41
- type: "object",
42
- description: "Filters to apply",
43
- properties: {
44
- person_id: { type: "string", description: "Filter by person ID" },
45
- project_id: { type: "string", description: "Filter by project ID" },
46
- service_id: { type: "string", description: "Filter by service ID" },
47
- task_id: { type: "string", description: "Filter by task ID" },
48
- after: { type: "string", description: "After date (YYYY-MM-DD)" },
49
- before: { type: "string", description: "Before date (YYYY-MM-DD)" }
50
- }
23
+ action: {
24
+ type: "string",
25
+ enum: ["list", "get", "create", "update", "me", "start", "stop"]
51
26
  },
52
- page: { type: "number", description: "Page number (default: 1)" },
53
- per_page: { type: "number", description: "Items per page (default: 50, max: 200)" }
54
- }
55
- }
56
- },
57
- {
58
- name: "productive_get_time_entry",
59
- description: "Get details for a specific time entry by ID",
60
- inputSchema: {
61
- type: "object",
62
- properties: {
63
- id: { type: "string", description: "Time entry ID" }
27
+ id: { type: "string" },
28
+ filter: { type: "object" },
29
+ page: { type: "number" },
30
+ per_page: { type: "number" },
31
+ compact: { type: "boolean" },
32
+ // Common fields
33
+ person_id: { type: "string" },
34
+ service_id: { type: "string" },
35
+ task_id: { type: "string" },
36
+ company_id: { type: "string" },
37
+ time: { type: "number" },
38
+ date: { type: "string" },
39
+ note: { type: "string" },
40
+ // Task fields
41
+ title: { type: "string" },
42
+ project_id: { type: "string" },
43
+ task_list_id: { type: "string" },
44
+ description: { type: "string" },
45
+ assignee_id: { type: "string" },
46
+ // Company fields
47
+ name: { type: "string" },
48
+ // Comment fields
49
+ body: { type: "string" },
50
+ deal_id: { type: "string" },
51
+ // Timer fields
52
+ time_entry_id: { type: "string" },
53
+ // Booking fields
54
+ started_on: { type: "string" },
55
+ ended_on: { type: "string" },
56
+ event_id: { type: "string" }
64
57
  },
65
- required: ["id"]
66
- }
67
- },
68
- {
69
- name: "productive_create_time_entry",
70
- description: "Create a new time entry",
71
- inputSchema: {
72
- type: "object",
73
- properties: {
74
- person_id: { type: "string", description: "Person ID" },
75
- service_id: { type: "string", description: "Service ID" },
76
- time: { type: "number", description: "Time in minutes" },
77
- date: { type: "string", description: "Date (YYYY-MM-DD)" },
78
- note: { type: "string", description: "Note/description" },
79
- task_id: { type: "string", description: "Task ID (optional)" }
80
- },
81
- required: ["person_id", "service_id", "time", "date"]
82
- }
83
- },
84
- {
85
- name: "productive_update_time_entry",
86
- description: "Update an existing time entry",
87
- inputSchema: {
88
- type: "object",
89
- properties: {
90
- id: { type: "string", description: "Time entry ID" },
91
- time: { type: "number", description: "Time in minutes" },
92
- date: { type: "string", description: "Date (YYYY-MM-DD)" },
93
- note: { type: "string", description: "Note/description" },
94
- service_id: { type: "string", description: "Service ID" },
95
- task_id: { type: "string", description: "Task ID" }
96
- },
97
- required: ["id"]
98
- }
99
- },
100
- {
101
- name: "productive_delete_time_entry",
102
- description: "Delete a time entry",
103
- inputSchema: {
104
- type: "object",
105
- properties: {
106
- id: { type: "string", description: "Time entry ID" }
107
- },
108
- required: ["id"]
109
- }
110
- },
111
- {
112
- name: "productive_list_tasks",
113
- description: "List tasks with optional filters",
114
- inputSchema: {
115
- type: "object",
116
- properties: {
117
- filter: {
118
- type: "object",
119
- description: "Filters to apply",
120
- properties: {
121
- project_id: { type: "string", description: "Filter by project ID" },
122
- assignee_id: { type: "string", description: "Filter by assignee ID" },
123
- task_list_id: { type: "string", description: "Filter by task list ID" },
124
- workflow_status_id: { type: "string", description: "Filter by workflow status ID" }
125
- }
126
- },
127
- page: { type: "number", description: "Page number (default: 1)" },
128
- per_page: { type: "number", description: "Items per page (default: 50, max: 200)" }
129
- }
130
- }
131
- },
132
- {
133
- name: "productive_get_task",
134
- description: "Get details for a specific task by ID",
135
- inputSchema: {
136
- type: "object",
137
- properties: {
138
- id: { type: "string", description: "Task ID" }
139
- },
140
- required: ["id"]
141
- }
142
- },
143
- {
144
- name: "productive_list_services",
145
- description: "List services (budget line items) with optional filters",
146
- inputSchema: {
147
- type: "object",
148
- properties: {
149
- filter: {
150
- type: "object",
151
- description: "Filters to apply",
152
- properties: {
153
- project_id: { type: "string", description: "Filter by project ID" },
154
- deal_id: { type: "string", description: "Filter by deal ID" }
155
- }
156
- },
157
- page: { type: "number", description: "Page number (default: 1)" },
158
- per_page: { type: "number", description: "Items per page (default: 50, max: 200)" }
159
- }
160
- }
161
- },
162
- {
163
- name: "productive_list_people",
164
- description: "List people from the organization",
165
- inputSchema: {
166
- type: "object",
167
- properties: {
168
- filter: {
169
- type: "object",
170
- description: "Filters to apply",
171
- properties: {
172
- archived: { type: "boolean", description: "Filter by archived status" }
173
- }
174
- },
175
- page: { type: "number", description: "Page number (default: 1)" },
176
- per_page: { type: "number", description: "Items per page (default: 50, max: 200)" }
177
- }
178
- }
179
- },
180
- {
181
- name: "productive_get_person",
182
- description: "Get details for a specific person by ID",
183
- inputSchema: {
184
- type: "object",
185
- properties: {
186
- id: { type: "string", description: "Person ID" }
187
- },
188
- required: ["id"]
189
- }
190
- },
191
- {
192
- name: "productive_get_current_user",
193
- description: "Get the current authenticated user information",
194
- inputSchema: {
195
- type: "object",
196
- properties: {}
58
+ required: ["resource", "action"]
197
59
  }
198
60
  }
199
61
  ];
200
62
  const STDIO_ONLY_TOOLS = [
201
63
  {
202
64
  name: "productive_configure",
203
- description: "Configure Productive.io credentials (organization ID, API token, and optionally user ID)",
65
+ description: "Configure Productive.io credentials",
204
66
  inputSchema: {
205
67
  type: "object",
206
68
  properties: {
207
- organizationId: { type: "string", description: "Your Productive.io organization ID" },
208
- apiToken: { type: "string", description: "Your Productive.io API token" },
209
- userId: { type: "string", description: "Your Productive.io user ID (optional, for time entries)" }
69
+ organizationId: { type: "string" },
70
+ apiToken: { type: "string" },
71
+ userId: { type: "string" }
210
72
  },
211
73
  required: ["organizationId", "apiToken"]
212
74
  }
213
75
  },
214
76
  {
215
77
  name: "productive_get_config",
216
- description: "Get current Productive.io configuration (without exposing the API token)",
78
+ description: "Get current configuration",
217
79
  inputSchema: {
218
80
  type: "object",
219
81
  properties: {}
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sources":["../src/tools.ts"],"sourcesContent":["import type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Tool definitions for Productive.io MCP server\n * These are shared between stdio and HTTP transports\n */\nexport const TOOLS: Tool[] = [\n {\n name: 'productive_list_projects',\n description: 'List projects from Productive.io with optional filters',\n inputSchema: {\n type: 'object',\n properties: {\n filter: {\n type: 'object',\n description: 'Filters to apply',\n properties: {\n board_id: { type: 'string', description: 'Filter by board ID' },\n company_id: { type: 'string', description: 'Filter by company ID' },\n project_manager_id: { type: 'string', description: 'Filter by project manager ID' },\n workflow_status: { type: 'string', description: 'Filter by workflow status' },\n },\n },\n page: { type: 'number', description: 'Page number (default: 1)' },\n per_page: { type: 'number', description: 'Items per page (default: 50, max: 200)' },\n },\n },\n },\n {\n name: 'productive_get_project',\n description: 'Get details for a specific project by ID',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Project ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'productive_list_time_entries',\n description: 'List time entries with optional filters',\n inputSchema: {\n type: 'object',\n properties: {\n filter: {\n type: 'object',\n description: 'Filters to apply',\n properties: {\n person_id: { type: 'string', description: 'Filter by person ID' },\n project_id: { type: 'string', description: 'Filter by project ID' },\n service_id: { type: 'string', description: 'Filter by service ID' },\n task_id: { type: 'string', description: 'Filter by task ID' },\n after: { type: 'string', description: 'After date (YYYY-MM-DD)' },\n before: { type: 'string', description: 'Before date (YYYY-MM-DD)' },\n },\n },\n page: { type: 'number', description: 'Page number (default: 1)' },\n per_page: { type: 'number', description: 'Items per page (default: 50, max: 200)' },\n },\n },\n },\n {\n name: 'productive_get_time_entry',\n description: 'Get details for a specific time entry by ID',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Time entry ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'productive_create_time_entry',\n description: 'Create a new time entry',\n inputSchema: {\n type: 'object',\n properties: {\n person_id: { type: 'string', description: 'Person ID' },\n service_id: { type: 'string', description: 'Service ID' },\n time: { type: 'number', description: 'Time in minutes' },\n date: { type: 'string', description: 'Date (YYYY-MM-DD)' },\n note: { type: 'string', description: 'Note/description' },\n task_id: { type: 'string', description: 'Task ID (optional)' },\n },\n required: ['person_id', 'service_id', 'time', 'date'],\n },\n },\n {\n name: 'productive_update_time_entry',\n description: 'Update an existing time entry',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Time entry ID' },\n time: { type: 'number', description: 'Time in minutes' },\n date: { type: 'string', description: 'Date (YYYY-MM-DD)' },\n note: { type: 'string', description: 'Note/description' },\n service_id: { type: 'string', description: 'Service ID' },\n task_id: { type: 'string', description: 'Task ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'productive_delete_time_entry',\n description: 'Delete a time entry',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Time entry ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'productive_list_tasks',\n description: 'List tasks with optional filters',\n inputSchema: {\n type: 'object',\n properties: {\n filter: {\n type: 'object',\n description: 'Filters to apply',\n properties: {\n project_id: { type: 'string', description: 'Filter by project ID' },\n assignee_id: { type: 'string', description: 'Filter by assignee ID' },\n task_list_id: { type: 'string', description: 'Filter by task list ID' },\n workflow_status_id: { type: 'string', description: 'Filter by workflow status ID' },\n },\n },\n page: { type: 'number', description: 'Page number (default: 1)' },\n per_page: { type: 'number', description: 'Items per page (default: 50, max: 200)' },\n },\n },\n },\n {\n name: 'productive_get_task',\n description: 'Get details for a specific task by ID',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Task ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'productive_list_services',\n description: 'List services (budget line items) with optional filters',\n inputSchema: {\n type: 'object',\n properties: {\n filter: {\n type: 'object',\n description: 'Filters to apply',\n properties: {\n project_id: { type: 'string', description: 'Filter by project ID' },\n deal_id: { type: 'string', description: 'Filter by deal ID' },\n },\n },\n page: { type: 'number', description: 'Page number (default: 1)' },\n per_page: { type: 'number', description: 'Items per page (default: 50, max: 200)' },\n },\n },\n },\n {\n name: 'productive_list_people',\n description: 'List people from the organization',\n inputSchema: {\n type: 'object',\n properties: {\n filter: {\n type: 'object',\n description: 'Filters to apply',\n properties: {\n archived: { type: 'boolean', description: 'Filter by archived status' },\n },\n },\n page: { type: 'number', description: 'Page number (default: 1)' },\n per_page: { type: 'number', description: 'Items per page (default: 50, max: 200)' },\n },\n },\n },\n {\n name: 'productive_get_person',\n description: 'Get details for a specific person by ID',\n inputSchema: {\n type: 'object',\n properties: {\n id: { type: 'string', description: 'Person ID' },\n },\n required: ['id'],\n },\n },\n {\n name: 'productive_get_current_user',\n description: 'Get the current authenticated user information',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n];\n\n/**\n * Additional tools only available in stdio mode (local execution)\n * These tools manage persistent configuration\n */\nexport const STDIO_ONLY_TOOLS: Tool[] = [\n {\n name: 'productive_configure',\n description: 'Configure Productive.io credentials (organization ID, API token, and optionally user ID)',\n inputSchema: {\n type: 'object',\n properties: {\n organizationId: { type: 'string', description: 'Your Productive.io organization ID' },\n apiToken: { type: 'string', description: 'Your Productive.io API token' },\n userId: { type: 'string', description: 'Your Productive.io user ID (optional, for time entries)' },\n },\n required: ['organizationId', 'apiToken'],\n },\n },\n {\n name: 'productive_get_config',\n description: 'Get current Productive.io configuration (without exposing the API token)',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n];\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sources":["../src/tools.ts"],"sourcesContent":["import type { Tool } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * Single consolidated tool for Productive.io MCP server\n *\n * Optimized for minimal token overhead (~170 tokens vs ~1300 for individual tools)\n */\nexport const TOOLS: Tool[] = [\n {\n name: 'productive',\n description:\n 'Productive.io API. Resources: projects, time, tasks, services, people, companies, comments, timers, deals, bookings. Actions: list, get, create, update (varies by resource), start/stop (timers), me (people). Filters: project_id, person_id, service_id, company_id, after/before (dates).',\n inputSchema: {\n type: 'object',\n properties: {\n resource: {\n type: 'string',\n enum: [\n 'projects',\n 'time',\n 'tasks',\n 'services',\n 'people',\n 'companies',\n 'comments',\n 'timers',\n 'deals',\n 'bookings',\n ],\n },\n action: {\n type: 'string',\n enum: ['list', 'get', 'create', 'update', 'me', 'start', 'stop'],\n },\n id: { type: 'string' },\n filter: { type: 'object' },\n page: { type: 'number' },\n per_page: { type: 'number' },\n compact: { type: 'boolean' },\n // Common fields\n person_id: { type: 'string' },\n service_id: { type: 'string' },\n task_id: { type: 'string' },\n company_id: { type: 'string' },\n time: { type: 'number' },\n date: { type: 'string' },\n note: { type: 'string' },\n // Task fields\n title: { type: 'string' },\n project_id: { type: 'string' },\n task_list_id: { type: 'string' },\n description: { type: 'string' },\n assignee_id: { type: 'string' },\n // Company fields\n name: { type: 'string' },\n // Comment fields\n body: { type: 'string' },\n deal_id: { type: 'string' },\n // Timer fields\n time_entry_id: { type: 'string' },\n // Booking fields\n started_on: { type: 'string' },\n ended_on: { type: 'string' },\n event_id: { type: 'string' },\n },\n required: ['resource', 'action'],\n },\n },\n];\n\n/**\n * Additional tools only available in stdio mode (local execution)\n * These tools manage persistent configuration\n */\nexport const STDIO_ONLY_TOOLS: Tool[] = [\n {\n name: 'productive_configure',\n description: 'Configure Productive.io credentials',\n inputSchema: {\n type: 'object',\n properties: {\n organizationId: { type: 'string' },\n apiToken: { type: 'string' },\n userId: { type: 'string' },\n },\n required: ['organizationId', 'apiToken'],\n },\n },\n {\n name: 'productive_get_config',\n description: 'Get current configuration',\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n];\n"],"names":[],"mappings":"AAOO,MAAM,QAAgB;AAAA,EAC3B;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,UAAU;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA;AAAA,QACF;AAAA,QAEF,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,MAAM,CAAC,QAAQ,OAAO,UAAU,UAAU,MAAM,SAAS,MAAM;AAAA,QAAA;AAAA,QAEjE,IAAI,EAAE,MAAM,SAAA;AAAA,QACZ,QAAQ,EAAE,MAAM,SAAA;AAAA,QAChB,MAAM,EAAE,MAAM,SAAA;AAAA,QACd,UAAU,EAAE,MAAM,SAAA;AAAA,QAClB,SAAS,EAAE,MAAM,UAAA;AAAA;AAAA,QAEjB,WAAW,EAAE,MAAM,SAAA;AAAA,QACnB,YAAY,EAAE,MAAM,SAAA;AAAA,QACpB,SAAS,EAAE,MAAM,SAAA;AAAA,QACjB,YAAY,EAAE,MAAM,SAAA;AAAA,QACpB,MAAM,EAAE,MAAM,SAAA;AAAA,QACd,MAAM,EAAE,MAAM,SAAA;AAAA,QACd,MAAM,EAAE,MAAM,SAAA;AAAA;AAAA,QAEd,OAAO,EAAE,MAAM,SAAA;AAAA,QACf,YAAY,EAAE,MAAM,SAAA;AAAA,QACpB,cAAc,EAAE,MAAM,SAAA;AAAA,QACtB,aAAa,EAAE,MAAM,SAAA;AAAA,QACrB,aAAa,EAAE,MAAM,SAAA;AAAA;AAAA,QAErB,MAAM,EAAE,MAAM,SAAA;AAAA;AAAA,QAEd,MAAM,EAAE,MAAM,SAAA;AAAA,QACd,SAAS,EAAE,MAAM,SAAA;AAAA;AAAA,QAEjB,eAAe,EAAE,MAAM,SAAA;AAAA;AAAA,QAEvB,YAAY,EAAE,MAAM,SAAA;AAAA,QACpB,UAAU,EAAE,MAAM,SAAA;AAAA,QAClB,UAAU,EAAE,MAAM,SAAA;AAAA,MAAS;AAAA,MAE7B,UAAU,CAAC,YAAY,QAAQ;AAAA,IAAA;AAAA,EACjC;AAEJ;AAMO,MAAM,mBAA2B;AAAA,EACtC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY;AAAA,QACV,gBAAgB,EAAE,MAAM,SAAA;AAAA,QACxB,UAAU,EAAE,MAAM,SAAA;AAAA,QAClB,QAAQ,EAAE,MAAM,SAAA;AAAA,MAAS;AAAA,MAE3B,UAAU,CAAC,kBAAkB,UAAU;AAAA,IAAA;AAAA,EACzC;AAAA,EAEF;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,MAAM;AAAA,MACN,YAAY,CAAA;AAAA,IAAC;AAAA,EACf;AAEJ;"}
@@ -0,0 +1,5 @@
1
+ const VERSION = "0.6.0";
2
+ export {
3
+ VERSION as V
4
+ };
5
+ //# sourceMappingURL=version-BmTJXDFu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version-uWLfG4Z0.js","sources":["../src/version.ts"],"sourcesContent":["/**\n * Package version - injected from package.json at build time\n */\ndeclare const __VERSION__: string;\nexport const VERSION = __VERSION__;\n"],"names":[],"mappings":"AAIO,MAAM,UAAU;"}
1
+ {"version":3,"file":"version-BmTJXDFu.js","sources":["../src/version.ts"],"sourcesContent":["/**\n * Package version - injected from package.json at build time\n */\ndeclare const __VERSION__: string;\nexport const VERSION = __VERSION__;\n"],"names":[],"mappings":"AAIO,MAAM,UAAU;"}
package/package.json CHANGED
@@ -1,51 +1,68 @@
1
1
  {
2
2
  "name": "@studiometa/productive-mcp",
3
- "version": "0.4.6",
3
+ "version": "0.6.0",
4
4
  "description": "MCP server for Productive.io API - Model Context Protocol integration for Claude Desktop",
5
- "type": "module",
6
- "publishConfig": {
7
- "access": "public"
5
+ "keywords": [
6
+ "ai",
7
+ "claude",
8
+ "http",
9
+ "mcp",
10
+ "model-context-protocol",
11
+ "productive",
12
+ "project-management",
13
+ "remote"
14
+ ],
15
+ "license": "MIT",
16
+ "author": "Studio Meta",
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/studiometa/productive-tools",
20
+ "directory": "packages/productive-mcp"
8
21
  },
9
22
  "bin": {
10
23
  "productive-mcp": "./dist/index.js",
11
24
  "productive-mcp-server": "./dist/server.js"
12
25
  },
26
+ "files": [
27
+ "dist",
28
+ "Dockerfile"
29
+ ],
30
+ "type": "module",
13
31
  "main": "./dist/index.js",
14
32
  "types": "./dist/index.d.ts",
15
33
  "exports": {
16
34
  ".": {
17
- "import": "./dist/index.js",
18
- "types": "./dist/index.d.ts"
35
+ "types": "./dist/index.d.ts",
36
+ "import": "./dist/index.js"
19
37
  },
20
38
  "./server": {
21
- "import": "./dist/server.js",
22
- "types": "./dist/server.d.ts"
39
+ "types": "./dist/server.d.ts",
40
+ "import": "./dist/server.js"
23
41
  },
24
42
  "./auth": {
25
- "import": "./dist/auth.js",
26
- "types": "./dist/auth.d.ts"
43
+ "types": "./dist/auth.d.ts",
44
+ "import": "./dist/auth.js"
27
45
  },
28
46
  "./crypto": {
29
- "import": "./dist/crypto.js",
30
- "types": "./dist/crypto.d.ts"
47
+ "types": "./dist/crypto.d.ts",
48
+ "import": "./dist/crypto.js"
31
49
  },
32
50
  "./oauth": {
33
- "import": "./dist/oauth.js",
34
- "types": "./dist/oauth.d.ts"
51
+ "types": "./dist/oauth.d.ts",
52
+ "import": "./dist/oauth.js"
35
53
  },
36
54
  "./tools": {
37
- "import": "./dist/tools.js",
38
- "types": "./dist/tools.d.ts"
55
+ "types": "./dist/tools.d.ts",
56
+ "import": "./dist/tools.js"
39
57
  },
40
58
  "./handlers": {
41
- "import": "./dist/handlers.js",
42
- "types": "./dist/handlers.d.ts"
59
+ "types": "./dist/handlers.d.ts",
60
+ "import": "./dist/handlers.js"
43
61
  }
44
62
  },
45
- "files": [
46
- "dist",
47
- "Dockerfile"
48
- ],
63
+ "publishConfig": {
64
+ "access": "public"
65
+ },
49
66
  "scripts": {
50
67
  "dev": "vite build --watch",
51
68
  "dev:server": "node --watch dist/server.js",
@@ -55,30 +72,10 @@
55
72
  "test:watch": "vitest",
56
73
  "test:ci": "vitest run --coverage",
57
74
  "lint": "oxlint src",
58
- "format": "oxlint --fix src",
59
- "format:check": "oxlint src",
75
+ "format": "oxfmt --write src",
76
+ "format:check": "oxfmt --check src",
60
77
  "typecheck": "tsc --noEmit"
61
78
  },
62
- "keywords": [
63
- "mcp",
64
- "model-context-protocol",
65
- "productive",
66
- "claude",
67
- "ai",
68
- "project-management",
69
- "http",
70
- "remote"
71
- ],
72
- "author": "Studio Meta",
73
- "license": "MIT",
74
- "repository": {
75
- "type": "git",
76
- "url": "https://github.com/studiometa/productive-tools",
77
- "directory": "packages/productive-mcp"
78
- },
79
- "engines": {
80
- "node": ">=20.0.0"
81
- },
82
79
  "dependencies": {
83
80
  "@modelcontextprotocol/sdk": "^1.0.4",
84
81
  "@studiometa/productive-cli": "*",
@@ -87,9 +84,12 @@
87
84
  "devDependencies": {
88
85
  "@types/node": "^22.10.5",
89
86
  "@vitest/coverage-v8": "2.1.9",
90
- "oxlint": "^0.16.1",
87
+ "oxlint": "^1.43.0",
91
88
  "typescript": "^5.7.3",
92
89
  "vite": "^6.0.7",
93
90
  "vitest": "^2.1.8"
91
+ },
92
+ "engines": {
93
+ "node": ">=20.0.0"
94
94
  }
95
95
  }
@@ -1,5 +0,0 @@
1
- const VERSION = "0.4.6";
2
- export {
3
- VERSION as V
4
- };
5
- //# sourceMappingURL=version-uWLfG4Z0.js.map