@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.
- package/Dockerfile +7 -0
- package/README.md +160 -61
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/crypto.js +1 -1
- package/dist/crypto.js.map +1 -1
- package/dist/formatters.d.ts +38 -8
- package/dist/formatters.d.ts.map +1 -1
- package/dist/handlers/bookings.d.ts +6 -0
- package/dist/handlers/bookings.d.ts.map +1 -0
- package/dist/handlers/comments.d.ts +6 -0
- package/dist/handlers/comments.d.ts.map +1 -0
- package/dist/handlers/companies.d.ts +6 -0
- package/dist/handlers/companies.d.ts.map +1 -0
- package/dist/handlers/deals.d.ts +6 -0
- package/dist/handlers/deals.d.ts.map +1 -0
- package/dist/handlers/index.d.ts +15 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/people.d.ts +7 -0
- package/dist/handlers/people.d.ts.map +1 -0
- package/dist/handlers/projects.d.ts +6 -0
- package/dist/handlers/projects.d.ts.map +1 -0
- package/dist/handlers/services.d.ts +6 -0
- package/dist/handlers/services.d.ts.map +1 -0
- package/dist/handlers/tasks.d.ts +6 -0
- package/dist/handlers/tasks.d.ts.map +1 -0
- package/dist/handlers/time.d.ts +6 -0
- package/dist/handlers/time.d.ts.map +1 -0
- package/dist/handlers/timers.d.ts +6 -0
- package/dist/handlers/timers.d.ts.map +1 -0
- package/dist/handlers/types.d.ts +78 -0
- package/dist/handlers/types.d.ts.map +1 -0
- package/dist/handlers/utils.d.ts +17 -0
- package/dist/handlers/utils.d.ts.map +1 -0
- package/dist/handlers.d.ts +3 -12
- package/dist/handlers.d.ts.map +1 -1
- package/dist/handlers.js +2 -135
- package/dist/handlers.js.map +1 -1
- package/dist/http.js +3 -3
- package/dist/http.js.map +1 -1
- package/dist/index-CmTDkz-y.js +480 -0
- package/dist/index-CmTDkz-y.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +1 -1
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +111 -12
- package/dist/oauth.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -2
- package/dist/server.js.map +1 -1
- package/dist/stdio.d.ts.map +1 -1
- package/dist/stdio.js +1 -1
- package/dist/stdio.js.map +1 -1
- package/dist/tools.d.ts +3 -2
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +55 -193
- package/dist/tools.js.map +1 -1
- package/dist/version-BmTJXDFu.js +5 -0
- package/dist/{version-uWLfG4Z0.js.map → version-BmTJXDFu.js.map} +1 -1
- package/package.json +45 -45
- package/dist/version-uWLfG4Z0.js +0 -5
package/dist/tools.js
CHANGED
|
@@ -1,219 +1,81 @@
|
|
|
1
1
|
const TOOLS = [
|
|
2
2
|
{
|
|
3
|
-
name: "
|
|
4
|
-
description: "
|
|
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
|
-
|
|
9
|
-
type: "
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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: ["
|
|
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
|
|
65
|
+
description: "Configure Productive.io credentials",
|
|
204
66
|
inputSchema: {
|
|
205
67
|
type: "object",
|
|
206
68
|
properties: {
|
|
207
|
-
organizationId: { type: "string"
|
|
208
|
-
apiToken: { type: "string"
|
|
209
|
-
userId: { type: "string"
|
|
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
|
|
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;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-
|
|
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.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "MCP server for Productive.io API - Model Context Protocol integration for Claude Desktop",
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
"
|
|
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
|
-
"
|
|
18
|
-
"
|
|
35
|
+
"types": "./dist/index.d.ts",
|
|
36
|
+
"import": "./dist/index.js"
|
|
19
37
|
},
|
|
20
38
|
"./server": {
|
|
21
|
-
"
|
|
22
|
-
"
|
|
39
|
+
"types": "./dist/server.d.ts",
|
|
40
|
+
"import": "./dist/server.js"
|
|
23
41
|
},
|
|
24
42
|
"./auth": {
|
|
25
|
-
"
|
|
26
|
-
"
|
|
43
|
+
"types": "./dist/auth.d.ts",
|
|
44
|
+
"import": "./dist/auth.js"
|
|
27
45
|
},
|
|
28
46
|
"./crypto": {
|
|
29
|
-
"
|
|
30
|
-
"
|
|
47
|
+
"types": "./dist/crypto.d.ts",
|
|
48
|
+
"import": "./dist/crypto.js"
|
|
31
49
|
},
|
|
32
50
|
"./oauth": {
|
|
33
|
-
"
|
|
34
|
-
"
|
|
51
|
+
"types": "./dist/oauth.d.ts",
|
|
52
|
+
"import": "./dist/oauth.js"
|
|
35
53
|
},
|
|
36
54
|
"./tools": {
|
|
37
|
-
"
|
|
38
|
-
"
|
|
55
|
+
"types": "./dist/tools.d.ts",
|
|
56
|
+
"import": "./dist/tools.js"
|
|
39
57
|
},
|
|
40
58
|
"./handlers": {
|
|
41
|
-
"
|
|
42
|
-
"
|
|
59
|
+
"types": "./dist/handlers.d.ts",
|
|
60
|
+
"import": "./dist/handlers.js"
|
|
43
61
|
}
|
|
44
62
|
},
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
|
|
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": "
|
|
59
|
-
"format:check": "
|
|
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": "^
|
|
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
|
}
|