@studiometa/productive-mcp 0.8.5 → 0.9.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 (72) hide show
  1. package/README.md +84 -412
  2. package/dist/auth.js +37 -36
  3. package/dist/auth.js.map +1 -1
  4. package/dist/crypto.js +100 -61
  5. package/dist/crypto.js.map +1 -1
  6. package/dist/formatters.d.ts +18 -2
  7. package/dist/formatters.d.ts.map +1 -1
  8. package/dist/handlers/attachments.d.ts +6 -0
  9. package/dist/handlers/attachments.d.ts.map +1 -0
  10. package/dist/handlers/bookings.d.ts +1 -1
  11. package/dist/handlers/bookings.d.ts.map +1 -1
  12. package/dist/handlers/budgets.d.ts +9 -0
  13. package/dist/handlers/budgets.d.ts.map +1 -0
  14. package/dist/handlers/comments.d.ts +1 -1
  15. package/dist/handlers/comments.d.ts.map +1 -1
  16. package/dist/handlers/companies.d.ts +6 -2
  17. package/dist/handlers/companies.d.ts.map +1 -1
  18. package/dist/handlers/deals.d.ts +6 -2
  19. package/dist/handlers/deals.d.ts.map +1 -1
  20. package/dist/handlers/discussions.d.ts +13 -0
  21. package/dist/handlers/discussions.d.ts.map +1 -0
  22. package/dist/handlers/help.d.ts.map +1 -1
  23. package/dist/handlers/index.d.ts.map +1 -1
  24. package/dist/handlers/pages.d.ts +13 -0
  25. package/dist/handlers/pages.d.ts.map +1 -0
  26. package/dist/handlers/people.d.ts +6 -2
  27. package/dist/handlers/people.d.ts.map +1 -1
  28. package/dist/handlers/projects.d.ts +6 -2
  29. package/dist/handlers/projects.d.ts.map +1 -1
  30. package/dist/handlers/reports.d.ts +1 -4
  31. package/dist/handlers/reports.d.ts.map +1 -1
  32. package/dist/handlers/resolve.d.ts +24 -0
  33. package/dist/handlers/resolve.d.ts.map +1 -0
  34. package/dist/handlers/services.d.ts +1 -1
  35. package/dist/handlers/services.d.ts.map +1 -1
  36. package/dist/handlers/tasks.d.ts +6 -2
  37. package/dist/handlers/tasks.d.ts.map +1 -1
  38. package/dist/handlers/time.d.ts +10 -2
  39. package/dist/handlers/time.d.ts.map +1 -1
  40. package/dist/handlers/timers.d.ts +1 -1
  41. package/dist/handlers/timers.d.ts.map +1 -1
  42. package/dist/handlers/types.d.ts +42 -3
  43. package/dist/handlers/types.d.ts.map +1 -1
  44. package/dist/handlers-BYE2INiR.js +2681 -0
  45. package/dist/handlers-BYE2INiR.js.map +1 -0
  46. package/dist/handlers.js +2 -5
  47. package/dist/hints.d.ts +16 -0
  48. package/dist/hints.d.ts.map +1 -1
  49. package/dist/http.js +139 -160
  50. package/dist/http.js.map +1 -1
  51. package/dist/index.js +74 -54
  52. package/dist/index.js.map +1 -1
  53. package/dist/oauth.js +285 -255
  54. package/dist/oauth.js.map +1 -1
  55. package/dist/schema.d.ts +17 -0
  56. package/dist/schema.d.ts.map +1 -1
  57. package/dist/server.js +67 -50
  58. package/dist/server.js.map +1 -1
  59. package/dist/stdio.js +85 -105
  60. package/dist/stdio.js.map +1 -1
  61. package/dist/tools.js +155 -145
  62. package/dist/tools.js.map +1 -1
  63. package/dist/version-Dj8VXyV0.js +29 -0
  64. package/dist/version-Dj8VXyV0.js.map +1 -0
  65. package/package.json +10 -10
  66. package/skills/SKILL.md +209 -13
  67. package/Dockerfile +0 -36
  68. package/dist/handlers.js.map +0 -1
  69. package/dist/index-CZpVCEu4.js +0 -1681
  70. package/dist/index-CZpVCEu4.js.map +0 -1
  71. package/dist/version-BPy06P7x.js +0 -21
  72. package/dist/version-BPy06P7x.js.map +0 -1
package/dist/tools.js CHANGED
@@ -1,145 +1,155 @@
1
- const TOOLS = [
2
- {
3
- name: "productive",
4
- description: "Productive.io API. Resources: projects, time, tasks, services, people, companies, comments, timers, deals, bookings, reports. Actions: list, get, create, update (varies by resource), start/stop (timers), me (people), help (documentation). Use query for text search on list actions. Reports: use resource=reports, action=get with report_type. Filters: project_id, person_id, service_id, company_id, after/before (dates). Use include to fetch related data. Use compact=false for full details (default for get, true for list). Use action=help with a resource for detailed documentation.",
5
- annotations: {
6
- title: "Productive.io",
7
- readOnlyHint: false,
8
- destructiveHint: false,
9
- idempotentHint: false,
10
- openWorldHint: true
11
- },
12
- inputSchema: {
13
- type: "object",
14
- properties: {
15
- resource: {
16
- type: "string",
17
- enum: [
18
- "projects",
19
- "time",
20
- "tasks",
21
- "services",
22
- "people",
23
- "companies",
24
- "comments",
25
- "timers",
26
- "deals",
27
- "bookings",
28
- "reports"
29
- ]
30
- },
31
- action: {
32
- type: "string",
33
- enum: ["list", "get", "create", "update", "me", "start", "stop", "help"],
34
- description: 'Action to perform. Use "help" for detailed documentation on a resource.'
35
- },
36
- id: { type: "string" },
37
- filter: { type: "object" },
38
- page: { type: "number" },
39
- per_page: { type: "number" },
40
- compact: {
41
- type: "boolean",
42
- description: "Compact output (default: true for list, false for get)"
43
- },
44
- include: {
45
- type: "array",
46
- items: { type: "string" },
47
- description: 'Related resources to include (e.g., ["project", "assignee", "comments"])'
48
- },
49
- query: {
50
- type: "string",
51
- description: "Text search query for list actions (searches name/title fields)"
52
- },
53
- // Common fields
54
- person_id: { type: "string" },
55
- service_id: { type: "string" },
56
- task_id: { type: "string" },
57
- company_id: { type: "string" },
58
- time: { type: "number" },
59
- date: { type: "string" },
60
- note: { type: "string" },
61
- // Task fields
62
- title: { type: "string" },
63
- project_id: { type: "string" },
64
- task_list_id: { type: "string" },
65
- description: { type: "string" },
66
- assignee_id: { type: "string" },
67
- // Company fields
68
- name: { type: "string" },
69
- // Comment fields
70
- body: { type: "string" },
71
- deal_id: { type: "string" },
72
- // Timer fields
73
- time_entry_id: { type: "string" },
74
- // Booking fields
75
- started_on: { type: "string" },
76
- ended_on: { type: "string" },
77
- event_id: { type: "string" },
78
- // Report fields
79
- report_type: {
80
- type: "string",
81
- enum: [
82
- "time_reports",
83
- "project_reports",
84
- "budget_reports",
85
- "person_reports",
86
- "invoice_reports",
87
- "payment_reports",
88
- "service_reports",
89
- "task_reports",
90
- "company_reports",
91
- "deal_reports",
92
- "timesheet_reports"
93
- ]
94
- },
95
- group: { type: "string" },
96
- from: { type: "string" },
97
- to: { type: "string" },
98
- status: { type: "string" }
99
- },
100
- required: ["resource", "action"]
101
- }
102
- }
103
- ];
104
- const STDIO_ONLY_TOOLS = [
105
- {
106
- name: "productive_configure",
107
- description: "Configure Productive.io credentials",
108
- annotations: {
109
- title: "Configure Productive",
110
- readOnlyHint: false,
111
- destructiveHint: false,
112
- idempotentHint: true,
113
- openWorldHint: false
114
- },
115
- inputSchema: {
116
- type: "object",
117
- properties: {
118
- organizationId: { type: "string" },
119
- apiToken: { type: "string" },
120
- userId: { type: "string" }
121
- },
122
- required: ["organizationId", "apiToken"]
123
- }
124
- },
125
- {
126
- name: "productive_get_config",
127
- description: "Get current configuration",
128
- annotations: {
129
- title: "Get Productive Config",
130
- readOnlyHint: true,
131
- destructiveHint: false,
132
- idempotentHint: true,
133
- openWorldHint: false
134
- },
135
- inputSchema: {
136
- type: "object",
137
- properties: {}
138
- }
139
- }
140
- ];
141
- export {
142
- STDIO_ONLY_TOOLS,
143
- TOOLS
144
- };
145
- //# sourceMappingURL=tools.js.map
1
+ /**
2
+ * Single consolidated tool for Productive.io MCP server
3
+ *
4
+ * Optimized for minimal token overhead (~170 tokens vs ~1300 for individual tools)
5
+ *
6
+ * MCP Annotations (for MCP directory compliance):
7
+ * - readOnlyHint: false - Tool can create/update data
8
+ * - destructiveHint: false - Tool does not permanently delete data
9
+ * - idempotentHint: false - Create actions are not idempotent
10
+ * - openWorldHint: true - Tool interacts with external Productive.io API
11
+ */
12
+ const TOOLS = [{
13
+ name: "productive",
14
+ description: "Productive.io API. Resources: projects, time, tasks, services, people, companies, comments, timers, deals, bookings, reports. Actions: list, get, create, update (varies by resource), start/stop (timers), me (people), help (documentation). Use query for text search on list actions. Reports: use resource=reports, action=get with report_type. Filters: project_id, person_id, service_id, company_id, after/before (dates). Use include to fetch related data. Use compact=false for full details (default for get, true for list). Use action=help with a resource for detailed documentation.",
15
+ annotations: {
16
+ title: "Productive.io",
17
+ readOnlyHint: false,
18
+ destructiveHint: false,
19
+ idempotentHint: false,
20
+ openWorldHint: true
21
+ },
22
+ inputSchema: {
23
+ type: "object",
24
+ properties: {
25
+ resource: {
26
+ type: "string",
27
+ enum: [
28
+ "projects",
29
+ "time",
30
+ "tasks",
31
+ "services",
32
+ "people",
33
+ "companies",
34
+ "comments",
35
+ "timers",
36
+ "deals",
37
+ "bookings",
38
+ "reports"
39
+ ]
40
+ },
41
+ action: {
42
+ type: "string",
43
+ enum: [
44
+ "list",
45
+ "get",
46
+ "create",
47
+ "update",
48
+ "me",
49
+ "start",
50
+ "stop",
51
+ "help"
52
+ ],
53
+ description: "Action to perform. Use \"help\" for detailed documentation on a resource."
54
+ },
55
+ id: { type: "string" },
56
+ filter: { type: "object" },
57
+ page: { type: "number" },
58
+ per_page: { type: "number" },
59
+ compact: {
60
+ type: "boolean",
61
+ description: "Compact output (default: true for list, false for get)"
62
+ },
63
+ include: {
64
+ type: "array",
65
+ items: { type: "string" },
66
+ description: "Related resources to include (e.g., [\"project\", \"assignee\", \"comments\"])"
67
+ },
68
+ query: {
69
+ type: "string",
70
+ description: "Text search query for list actions (searches name/title fields)"
71
+ },
72
+ person_id: { type: "string" },
73
+ service_id: { type: "string" },
74
+ task_id: { type: "string" },
75
+ company_id: { type: "string" },
76
+ time: { type: "number" },
77
+ date: { type: "string" },
78
+ note: { type: "string" },
79
+ title: { type: "string" },
80
+ project_id: { type: "string" },
81
+ task_list_id: { type: "string" },
82
+ description: { type: "string" },
83
+ assignee_id: { type: "string" },
84
+ name: { type: "string" },
85
+ body: { type: "string" },
86
+ deal_id: { type: "string" },
87
+ time_entry_id: { type: "string" },
88
+ started_on: { type: "string" },
89
+ ended_on: { type: "string" },
90
+ event_id: { type: "string" },
91
+ report_type: {
92
+ type: "string",
93
+ enum: [
94
+ "time_reports",
95
+ "project_reports",
96
+ "budget_reports",
97
+ "person_reports",
98
+ "invoice_reports",
99
+ "payment_reports",
100
+ "service_reports",
101
+ "task_reports",
102
+ "company_reports",
103
+ "deal_reports",
104
+ "timesheet_reports"
105
+ ]
106
+ },
107
+ group: { type: "string" },
108
+ from: { type: "string" },
109
+ to: { type: "string" },
110
+ status: { type: "string" }
111
+ },
112
+ required: ["resource", "action"]
113
+ }
114
+ }];
115
+ /**
116
+ * Additional tools only available in stdio mode (local execution)
117
+ * These tools manage persistent configuration
118
+ */
119
+ const STDIO_ONLY_TOOLS = [{
120
+ name: "productive_configure",
121
+ description: "Configure Productive.io credentials",
122
+ annotations: {
123
+ title: "Configure Productive",
124
+ readOnlyHint: false,
125
+ destructiveHint: false,
126
+ idempotentHint: true,
127
+ openWorldHint: false
128
+ },
129
+ inputSchema: {
130
+ type: "object",
131
+ properties: {
132
+ organizationId: { type: "string" },
133
+ apiToken: { type: "string" },
134
+ userId: { type: "string" }
135
+ },
136
+ required: ["organizationId", "apiToken"]
137
+ }
138
+ }, {
139
+ name: "productive_get_config",
140
+ description: "Get current configuration",
141
+ annotations: {
142
+ title: "Get Productive Config",
143
+ readOnlyHint: true,
144
+ destructiveHint: false,
145
+ idempotentHint: true,
146
+ openWorldHint: false
147
+ },
148
+ inputSchema: {
149
+ type: "object",
150
+ properties: {}
151
+ }
152
+ }];
153
+ export { STDIO_ONLY_TOOLS, TOOLS };
154
+
155
+ //# sourceMappingURL=tools.js.map
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 * Single consolidated tool for Productive.io MCP server\n *\n * Optimized for minimal token overhead (~170 tokens vs ~1300 for individual tools)\n *\n * MCP Annotations (for MCP directory compliance):\n * - readOnlyHint: false - Tool can create/update data\n * - destructiveHint: false - Tool does not permanently delete data\n * - idempotentHint: false - Create actions are not idempotent\n * - openWorldHint: true - Tool interacts with external Productive.io API\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, reports. Actions: list, get, create, update (varies by resource), start/stop (timers), me (people), help (documentation). Use query for text search on list actions. Reports: use resource=reports, action=get with report_type. Filters: project_id, person_id, service_id, company_id, after/before (dates). Use include to fetch related data. Use compact=false for full details (default for get, true for list). Use action=help with a resource for detailed documentation.',\n annotations: {\n title: 'Productive.io',\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\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 'reports',\n ],\n },\n action: {\n type: 'string',\n enum: ['list', 'get', 'create', 'update', 'me', 'start', 'stop', 'help'],\n description: 'Action to perform. Use \"help\" for detailed documentation on a resource.',\n },\n id: { type: 'string' },\n filter: { type: 'object' },\n page: { type: 'number' },\n per_page: { type: 'number' },\n compact: {\n type: 'boolean',\n description: 'Compact output (default: true for list, false for get)',\n },\n include: {\n type: 'array',\n items: { type: 'string' },\n description: 'Related resources to include (e.g., [\"project\", \"assignee\", \"comments\"])',\n },\n query: {\n type: 'string',\n description: 'Text search query for list actions (searches name/title fields)',\n },\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 // Report fields\n report_type: {\n type: 'string',\n enum: [\n 'time_reports',\n 'project_reports',\n 'budget_reports',\n 'person_reports',\n 'invoice_reports',\n 'payment_reports',\n 'service_reports',\n 'task_reports',\n 'company_reports',\n 'deal_reports',\n 'timesheet_reports',\n ],\n },\n group: { type: 'string' },\n from: { type: 'string' },\n to: { type: 'string' },\n status: { 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 annotations: {\n title: 'Configure Productive',\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\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 annotations: {\n title: 'Get Productive Config',\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n];\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","names":[],"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 *\n * MCP Annotations (for MCP directory compliance):\n * - readOnlyHint: false - Tool can create/update data\n * - destructiveHint: false - Tool does not permanently delete data\n * - idempotentHint: false - Create actions are not idempotent\n * - openWorldHint: true - Tool interacts with external Productive.io API\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, reports. Actions: list, get, create, update (varies by resource), start/stop (timers), me (people), help (documentation). Use query for text search on list actions. Reports: use resource=reports, action=get with report_type. Filters: project_id, person_id, service_id, company_id, after/before (dates). Use include to fetch related data. Use compact=false for full details (default for get, true for list). Use action=help with a resource for detailed documentation.',\n annotations: {\n title: 'Productive.io',\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\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 'reports',\n ],\n },\n action: {\n type: 'string',\n enum: ['list', 'get', 'create', 'update', 'me', 'start', 'stop', 'help'],\n description: 'Action to perform. Use \"help\" for detailed documentation on a resource.',\n },\n id: { type: 'string' },\n filter: { type: 'object' },\n page: { type: 'number' },\n per_page: { type: 'number' },\n compact: {\n type: 'boolean',\n description: 'Compact output (default: true for list, false for get)',\n },\n include: {\n type: 'array',\n items: { type: 'string' },\n description: 'Related resources to include (e.g., [\"project\", \"assignee\", \"comments\"])',\n },\n query: {\n type: 'string',\n description: 'Text search query for list actions (searches name/title fields)',\n },\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 // Report fields\n report_type: {\n type: 'string',\n enum: [\n 'time_reports',\n 'project_reports',\n 'budget_reports',\n 'person_reports',\n 'invoice_reports',\n 'payment_reports',\n 'service_reports',\n 'task_reports',\n 'company_reports',\n 'deal_reports',\n 'timesheet_reports',\n ],\n },\n group: { type: 'string' },\n from: { type: 'string' },\n to: { type: 'string' },\n status: { 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 annotations: {\n title: 'Configure Productive',\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\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 annotations: {\n title: 'Get Productive Config',\n readOnlyHint: true,\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n },\n inputSchema: {\n type: 'object',\n properties: {},\n },\n },\n];\n"],"mappings":";;;;;;;;;;;AAaA,MAAa,QAAgB,CAC3B;CACE,MAAM;CACN,aACE;CACF,aAAa;EACX,OAAO;EACP,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,eAAe;EAChB;CACD,aAAa;EACX,MAAM;EACN,YAAY;GACV,UAAU;IACR,MAAM;IACN,MAAM;KACJ;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACD;IACF;GACD,QAAQ;IACN,MAAM;IACN,MAAM;KAAC;KAAQ;KAAO;KAAU;KAAU;KAAM;KAAS;KAAQ;KAAO;IACxE,aAAa;IACd;GACD,IAAI,EAAE,MAAM,UAAU;GACtB,QAAQ,EAAE,MAAM,UAAU;GAC1B,MAAM,EAAE,MAAM,UAAU;GACxB,UAAU,EAAE,MAAM,UAAU;GAC5B,SAAS;IACP,MAAM;IACN,aAAa;IACd;GACD,SAAS;IACP,MAAM;IACN,OAAO,EAAE,MAAM,UAAU;IACzB,aAAa;IACd;GACD,OAAO;IACL,MAAM;IACN,aAAa;IACd;GAED,WAAW,EAAE,MAAM,UAAU;GAC7B,YAAY,EAAE,MAAM,UAAU;GAC9B,SAAS,EAAE,MAAM,UAAU;GAC3B,YAAY,EAAE,MAAM,UAAU;GAC9B,MAAM,EAAE,MAAM,UAAU;GACxB,MAAM,EAAE,MAAM,UAAU;GACxB,MAAM,EAAE,MAAM,UAAU;GAExB,OAAO,EAAE,MAAM,UAAU;GACzB,YAAY,EAAE,MAAM,UAAU;GAC9B,cAAc,EAAE,MAAM,UAAU;GAChC,aAAa,EAAE,MAAM,UAAU;GAC/B,aAAa,EAAE,MAAM,UAAU;GAE/B,MAAM,EAAE,MAAM,UAAU;GAExB,MAAM,EAAE,MAAM,UAAU;GACxB,SAAS,EAAE,MAAM,UAAU;GAE3B,eAAe,EAAE,MAAM,UAAU;GAEjC,YAAY,EAAE,MAAM,UAAU;GAC9B,UAAU,EAAE,MAAM,UAAU;GAC5B,UAAU,EAAE,MAAM,UAAU;GAE5B,aAAa;IACX,MAAM;IACN,MAAM;KACJ;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACD;IACF;GACD,OAAO,EAAE,MAAM,UAAU;GACzB,MAAM,EAAE,MAAM,UAAU;GACxB,IAAI,EAAE,MAAM,UAAU;GACtB,QAAQ,EAAE,MAAM,UAAU;GAC3B;EACD,UAAU,CAAC,YAAY,SAAS;EACjC;CACF,CACF;;;;;AAMD,MAAa,mBAA2B,CACtC;CACE,MAAM;CACN,aAAa;CACb,aAAa;EACX,OAAO;EACP,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,eAAe;EAChB;CACD,aAAa;EACX,MAAM;EACN,YAAY;GACV,gBAAgB,EAAE,MAAM,UAAU;GAClC,UAAU,EAAE,MAAM,UAAU;GAC5B,QAAQ,EAAE,MAAM,UAAU;GAC3B;EACD,UAAU,CAAC,kBAAkB,WAAW;EACzC;CACF,EACD;CACE,MAAM;CACN,aAAa;CACb,aAAa;EACX,OAAO;EACP,cAAc;EACd,iBAAiB;EACjB,gBAAgB;EAChB,eAAe;EAChB;CACD,aAAa;EACX,MAAM;EACN,YAAY,EAAE;EACf;CACF,CACF"}
@@ -0,0 +1,29 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ /**
5
+ * MCP Server Instructions
6
+ *
7
+ * These instructions are sent to Claude Desktop during initialization
8
+ * and used as context/hints for the LLM. This ensures the AI agent
9
+ * knows how to properly use the Productive.io MCP server.
10
+ *
11
+ * The content is derived from skills/SKILL.md (without YAML frontmatter).
12
+ */
13
+ var __dirname = dirname(fileURLToPath(import.meta.url));
14
+ /**
15
+ * Load instructions from SKILL.md file
16
+ * Removes YAML frontmatter (content between --- markers)
17
+ */
18
+ function loadInstructions() {
19
+ try {
20
+ return readFileSync(join(__dirname, "..", "skills", "SKILL.md"), "utf-8").replace(/^---\n[\s\S]*?\n---\n+/, "").trim();
21
+ } catch {
22
+ return "Productive.io MCP Server - Use the productive tool with resource and action parameters.";
23
+ }
24
+ }
25
+ const INSTRUCTIONS = loadInstructions();
26
+ const VERSION = "0.9.0";
27
+ export { INSTRUCTIONS as n, VERSION as t };
28
+
29
+ //# sourceMappingURL=version-Dj8VXyV0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-Dj8VXyV0.js","names":[],"sources":["../src/instructions.ts","../src/version.ts"],"sourcesContent":["/**\n * MCP Server Instructions\n *\n * These instructions are sent to Claude Desktop during initialization\n * and used as context/hints for the LLM. This ensures the AI agent\n * knows how to properly use the Productive.io MCP server.\n *\n * The content is derived from skills/SKILL.md (without YAML frontmatter).\n */\n\nimport { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n/**\n * Load instructions from SKILL.md file\n * Removes YAML frontmatter (content between --- markers)\n */\nfunction loadInstructions(): string {\n try {\n // In dist/, go up to package root, then to skills/\n const skillPath = join(__dirname, '..', 'skills', 'SKILL.md');\n const content = readFileSync(skillPath, 'utf-8');\n\n // Remove YAML frontmatter (between --- markers at start of file)\n const withoutFrontmatter = content.replace(/^---\\n[\\s\\S]*?\\n---\\n+/, '');\n\n return withoutFrontmatter.trim();\n } catch {\n // Fallback if file not found (shouldn't happen in production)\n return 'Productive.io MCP Server - Use the productive tool with resource and action parameters.';\n }\n}\n\nexport const INSTRUCTIONS = loadInstructions();\n","/**\n * Package version - injected from package.json at build time\n */\ndeclare const __VERSION__: string;\nexport const VERSION = __VERSION__;\n"],"mappings":";;;;;;;;;;;;AAcA,IAAM,YAAY,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;;;;;AAMzD,SAAS,mBAA2B;AAClC,KAAI;AAQF,SALgB,aADE,KAAK,WAAW,MAAM,UAAU,WAAW,EACrB,QAAQ,CAGb,QAAQ,0BAA0B,GAAG,CAE9C,MAAM;SAC1B;AAEN,SAAO;;;AAIX,MAAa,eAAe,kBAAkB;AChC9C,MAAa,UAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studiometa/productive-mcp",
3
- "version": "0.8.5",
3
+ "version": "0.9.0",
4
4
  "description": "MCP server for Productive.io API - Model Context Protocol integration for Claude Desktop",
5
5
  "keywords": [
6
6
  "ai",
@@ -17,7 +17,7 @@
17
17
  "repository": {
18
18
  "type": "git",
19
19
  "url": "https://github.com/studiometa/productive-tools",
20
- "directory": "packages/productive-mcp"
20
+ "directory": "packages/mcp"
21
21
  },
22
22
  "bin": {
23
23
  "productive-mcp": "./dist/index.js",
@@ -25,8 +25,7 @@
25
25
  },
26
26
  "files": [
27
27
  "dist",
28
- "skills",
29
- "Dockerfile"
28
+ "skills"
30
29
  ],
31
30
  "type": "module",
32
31
  "main": "./dist/index.js",
@@ -76,7 +75,7 @@
76
75
  "dev": "vite build --watch",
77
76
  "dev:server": "node --watch dist/server.js",
78
77
  "build": "vite build && tsc --emitDeclarationOnly && node scripts/postbuild.js",
79
- "prepublishOnly": "node scripts/prepublish.js",
78
+ "prepublishOnly": "npm run build",
80
79
  "start": "node dist/server.js",
81
80
  "test": "vitest run",
82
81
  "test:watch": "vitest",
@@ -84,21 +83,22 @@
84
83
  "lint": "oxlint src",
85
84
  "format": "oxfmt --write src",
86
85
  "format:check": "oxfmt --check src",
87
- "typecheck": "tsc --noEmit"
86
+ "typecheck": "tsgo --noEmit"
88
87
  },
89
88
  "dependencies": {
90
89
  "@modelcontextprotocol/sdk": "^1.26.0",
91
- "@studiometa/productive-cli": "0.8.5",
90
+ "@studiometa/productive-api": "0.9.0",
91
+ "@studiometa/productive-core": "0.9.0",
92
92
  "h3": "^1.15.1",
93
93
  "zod": "4.3.6"
94
94
  },
95
95
  "devDependencies": {
96
96
  "@types/node": "^22.10.5",
97
- "@vitest/coverage-v8": "^4.0.18",
97
+ "@vitest/coverage-v8": "^4.1.0-beta.4",
98
98
  "oxlint": "^1.43.0",
99
99
  "typescript": "^5.7.3",
100
- "vite": "^7.3.1",
101
- "vitest": "^4.0.18"
100
+ "vite": "^8.0.0-beta.14",
101
+ "vitest": "^4.1.0-beta.4"
102
102
  },
103
103
  "engines": {
104
104
  "node": ">=20.0.0"