@damper/mcp 0.6.2 → 0.8.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 (2) hide show
  1. package/dist/index.js +64 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -41,7 +41,7 @@ async function api(method, path, body) {
41
41
  // Server
42
42
  const server = new McpServer({
43
43
  name: 'damper',
44
- version: '0.5.1',
44
+ version: '0.6.0',
45
45
  });
46
46
  // Output schemas
47
47
  const SubtaskProgressSchema = z.object({
@@ -60,6 +60,7 @@ const TaskSummarySchema = z.object({
60
60
  dueDate: z.string().nullable().optional(),
61
61
  feedbackCount: z.number(),
62
62
  hasImplementationPlan: z.boolean(),
63
+ publicUrl: z.string().nullable().optional(),
63
64
  subtaskProgress: SubtaskProgressSchema.optional(),
64
65
  });
65
66
  const SubtaskSchema = z.object({
@@ -87,6 +88,7 @@ const TaskDetailSchema = z.object({
87
88
  subtasks: z.array(SubtaskSchema).optional(),
88
89
  agentNotes: z.string().nullable().optional(),
89
90
  commits: z.array(CommitSchema).optional(),
91
+ publicUrl: z.string().nullable().optional(),
90
92
  feedback: z.array(z.object({
91
93
  id: z.string(),
92
94
  title: z.string(),
@@ -242,6 +244,12 @@ server.registerTool('get_task', {
242
244
  parts.push(`\n## Feedback (${t.feedback.length})`);
243
245
  t.feedback.forEach((f) => parts.push(`- ${f.title} (${f.voterCount} votes)`));
244
246
  }
247
+ if (t.publicUrl) {
248
+ parts.push(`\nšŸ”— Public URL: ${t.publicUrl}`);
249
+ }
250
+ else if (t.publicUrlNote) {
251
+ parts.push(`\nšŸ”— ${t.publicUrlNote}`);
252
+ }
245
253
  // Add workflow reminder for tasks not yet started
246
254
  if (t.status === 'planned') {
247
255
  parts.push('\n---');
@@ -1974,6 +1982,61 @@ server.registerTool('update_project_settings', {
1974
1982
  structuredContent: result,
1975
1983
  };
1976
1984
  });
1985
+ // ==================== Public Pages ====================
1986
+ server.registerTool('open_public_page', {
1987
+ title: 'Open Public Page',
1988
+ description: 'Get the public URL for a project page (roadmap, feedback, changelog, or a specific roadmap item). ' +
1989
+ 'Use this to share links with users or open pages in a browser.\n\n' +
1990
+ '**IMPORTANT:** NEVER guess or construct public page URLs yourself. Always call this tool to get the correct URL.\n\n' +
1991
+ '**Pages:** roadmap, feedback, changelog, roadmap_item\n' +
1992
+ '**roadmap_item** requires `itemId` parameter.',
1993
+ inputSchema: z.object({
1994
+ page: z.enum(['roadmap', 'feedback', 'changelog', 'roadmap_item'])
1995
+ .describe('Which public page to get the URL for'),
1996
+ itemId: z.string().optional()
1997
+ .describe('Roadmap item ID (required when page is "roadmap_item")'),
1998
+ }),
1999
+ outputSchema: z.object({
2000
+ url: z.string(),
2001
+ enabled: z.boolean(),
2002
+ note: z.string().optional(),
2003
+ }),
2004
+ annotations: {
2005
+ readOnlyHint: true,
2006
+ destructiveHint: false,
2007
+ idempotentHint: true,
2008
+ openWorldHint: false,
2009
+ },
2010
+ }, async ({ page, itemId }) => {
2011
+ if (page === 'roadmap_item' && !itemId) {
2012
+ return {
2013
+ content: [{ type: 'text', text: 'Error: itemId is required when page is "roadmap_item"' }],
2014
+ isError: true,
2015
+ };
2016
+ }
2017
+ const data = await api('GET', '/api/agent/project/public-urls');
2018
+ let url;
2019
+ let enabled;
2020
+ if (page === 'roadmap_item') {
2021
+ url = data.roadmapItemUrlTemplate.replace('{itemId}', itemId);
2022
+ enabled = data.pages.roadmap.enabled;
2023
+ }
2024
+ else {
2025
+ const pageData = data.pages[page];
2026
+ url = pageData.url;
2027
+ enabled = pageData.enabled;
2028
+ }
2029
+ const note = !enabled
2030
+ ? `Note: This page is not currently enabled. The URL will work once the project owner enables it in settings.`
2031
+ : undefined;
2032
+ const parts = [url];
2033
+ if (note)
2034
+ parts.push(note);
2035
+ return {
2036
+ content: [{ type: 'text', text: parts.join('\n\n') }],
2037
+ structuredContent: { url, enabled, ...(note ? { note } : {}) },
2038
+ };
2039
+ });
1977
2040
  // Start
1978
2041
  async function main() {
1979
2042
  const transport = new StdioServerTransport();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damper/mcp",
3
- "version": "0.6.2",
3
+ "version": "0.8.0",
4
4
  "description": "MCP server for Damper task management",
5
5
  "author": "Damper <hello@usedamper.com>",
6
6
  "repository": {