@contextstream/mcp-server 0.3.49 → 0.3.50

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 +279 -4
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -7085,6 +7085,85 @@ W:${wsHint}
7085
7085
  if (params?.limit) urlParams.set("limit", String(params.limit));
7086
7086
  return request(this.config, `/integrations/knowledge?${urlParams.toString()}`, { method: "GET" });
7087
7087
  }
7088
+ // ============================================
7089
+ // Reminder Methods
7090
+ // ============================================
7091
+ /**
7092
+ * List reminders for the user
7093
+ */
7094
+ async remindersList(params) {
7095
+ const withDefaults = this.withDefaults(params || {});
7096
+ const query = new URLSearchParams();
7097
+ if (withDefaults.workspace_id) query.set("workspace_id", withDefaults.workspace_id);
7098
+ if (withDefaults.project_id) query.set("project_id", withDefaults.project_id);
7099
+ if (params?.status) query.set("status", params.status);
7100
+ if (params?.priority) query.set("priority", params.priority);
7101
+ if (params?.limit) query.set("limit", String(params.limit));
7102
+ const suffix = query.toString() ? `?${query.toString()}` : "";
7103
+ return request(this.config, `/reminders${suffix}`, { method: "GET" });
7104
+ }
7105
+ /**
7106
+ * Get active reminders (pending, overdue, due soon)
7107
+ */
7108
+ async remindersActive(params) {
7109
+ const withDefaults = this.withDefaults(params || {});
7110
+ const query = new URLSearchParams();
7111
+ if (withDefaults.workspace_id) query.set("workspace_id", withDefaults.workspace_id);
7112
+ if (withDefaults.project_id) query.set("project_id", withDefaults.project_id);
7113
+ if (params?.context) query.set("context", params.context);
7114
+ if (params?.limit) query.set("limit", String(params.limit));
7115
+ const suffix = query.toString() ? `?${query.toString()}` : "";
7116
+ return request(this.config, `/reminders/active${suffix}`, { method: "GET" });
7117
+ }
7118
+ /**
7119
+ * Create a new reminder
7120
+ */
7121
+ async remindersCreate(params) {
7122
+ const withDefaults = this.withDefaults(params);
7123
+ return request(this.config, "/reminders", {
7124
+ body: {
7125
+ workspace_id: withDefaults.workspace_id,
7126
+ project_id: withDefaults.project_id,
7127
+ title: params.title,
7128
+ content: params.content,
7129
+ remind_at: params.remind_at,
7130
+ priority: params.priority || "normal",
7131
+ keywords: params.keywords || [],
7132
+ recurrence: params.recurrence,
7133
+ memory_event_id: params.memory_event_id
7134
+ }
7135
+ });
7136
+ }
7137
+ /**
7138
+ * Snooze a reminder
7139
+ */
7140
+ async remindersSnooze(params) {
7141
+ uuidSchema.parse(params.reminder_id);
7142
+ return request(this.config, `/reminders/${params.reminder_id}/snooze`, {
7143
+ body: { until: params.until }
7144
+ });
7145
+ }
7146
+ /**
7147
+ * Mark a reminder as completed
7148
+ */
7149
+ async remindersComplete(params) {
7150
+ uuidSchema.parse(params.reminder_id);
7151
+ return request(this.config, `/reminders/${params.reminder_id}/complete`, { method: "POST" });
7152
+ }
7153
+ /**
7154
+ * Dismiss a reminder
7155
+ */
7156
+ async remindersDismiss(params) {
7157
+ uuidSchema.parse(params.reminder_id);
7158
+ return request(this.config, `/reminders/${params.reminder_id}/dismiss`, { method: "POST" });
7159
+ }
7160
+ /**
7161
+ * Delete a reminder
7162
+ */
7163
+ async remindersDelete(params) {
7164
+ uuidSchema.parse(params.reminder_id);
7165
+ return request(this.config, `/reminders/${params.reminder_id}`, { method: "DELETE" });
7166
+ }
7088
7167
  };
7089
7168
 
7090
7169
  // src/tools.ts
@@ -7707,12 +7786,16 @@ var LIGHT_TOOLSET = /* @__PURE__ */ new Set([
7707
7786
  "projects_index",
7708
7787
  "projects_index_status",
7709
7788
  "projects_files",
7710
- // Memory basics (2)
7789
+ // Memory basics (3)
7711
7790
  "memory_search",
7712
7791
  "memory_decisions",
7792
+ "memory_get_event",
7713
7793
  // Graph basics (2)
7714
7794
  "graph_related",
7715
7795
  "graph_decisions",
7796
+ // Reminders (2)
7797
+ "reminders_list",
7798
+ "reminders_active",
7716
7799
  // Utility (2)
7717
7800
  "auth_me",
7718
7801
  "mcp_server_version"
@@ -7751,11 +7834,14 @@ var STANDARD_TOOLSET = /* @__PURE__ */ new Set([
7751
7834
  "projects_index",
7752
7835
  "projects_index_status",
7753
7836
  "projects_files",
7754
- // Memory events (6)
7837
+ // Memory events (9)
7755
7838
  "memory_search",
7756
7839
  "memory_decisions",
7757
7840
  "memory_create_event",
7758
7841
  "memory_list_events",
7842
+ "memory_get_event",
7843
+ "memory_update_event",
7844
+ "memory_delete_event",
7759
7845
  "memory_timeline",
7760
7846
  "memory_summary",
7761
7847
  // Memory nodes (2)
@@ -7774,6 +7860,13 @@ var STANDARD_TOOLSET = /* @__PURE__ */ new Set([
7774
7860
  "search_semantic",
7775
7861
  "search_hybrid",
7776
7862
  "search_keyword",
7863
+ // Reminders (6)
7864
+ "reminders_list",
7865
+ "reminders_active",
7866
+ "reminders_create",
7867
+ "reminders_snooze",
7868
+ "reminders_complete",
7869
+ "reminders_dismiss",
7777
7870
  // Utility (2)
7778
7871
  "auth_me",
7779
7872
  "mcp_server_version"
@@ -8837,8 +8930,8 @@ Automatically detects code files and skips ignored directories like node_modules
8837
8930
  "memory_get_event",
8838
8931
  {
8839
8932
  title: "Get memory event",
8840
- description: "Get a specific memory event by ID",
8841
- inputSchema: external_exports.object({ event_id: external_exports.string().uuid() })
8933
+ description: "Get a specific memory event by ID with FULL content (not truncated). Use this when you need the complete content of a memory event, not just the preview returned by search/recall.",
8934
+ inputSchema: external_exports.object({ event_id: external_exports.string().uuid().describe("The UUID of the memory event to retrieve") })
8842
8935
  },
8843
8936
  async (input) => {
8844
8937
  const result = await client.getMemoryEvent(input.event_id);
@@ -10608,6 +10701,188 @@ Use this to verify integrations are healthy and syncing properly.`,
10608
10701
  return { content: [{ type: "text", text: formatted }], structuredContent: toStructured(result) };
10609
10702
  }
10610
10703
  );
10704
+ registerTool(
10705
+ "reminders_list",
10706
+ {
10707
+ title: "List reminders",
10708
+ description: `List all reminders for the current user.
10709
+ Returns: reminders with title, content, remind_at, priority, status, and keywords.
10710
+ Can filter by status (pending, completed, dismissed, snoozed) and priority (low, normal, high, urgent).
10711
+
10712
+ Use this to see what reminders you have set.`,
10713
+ inputSchema: external_exports.object({
10714
+ workspace_id: external_exports.string().uuid().optional(),
10715
+ project_id: external_exports.string().uuid().optional(),
10716
+ status: external_exports.enum(["pending", "completed", "dismissed", "snoozed"]).optional().describe("Filter by status"),
10717
+ priority: external_exports.enum(["low", "normal", "high", "urgent"]).optional().describe("Filter by priority"),
10718
+ limit: external_exports.number().optional().describe("Maximum reminders to return (default: 20)")
10719
+ })
10720
+ },
10721
+ async (input) => {
10722
+ const result = await client.remindersList({
10723
+ workspace_id: input.workspace_id,
10724
+ project_id: input.project_id,
10725
+ status: input.status,
10726
+ priority: input.priority,
10727
+ limit: input.limit
10728
+ });
10729
+ if (!result.reminders || result.reminders.length === 0) {
10730
+ return { content: [{ type: "text", text: "No reminders found." }] };
10731
+ }
10732
+ return { content: [{ type: "text", text: formatContent(result) }], structuredContent: toStructured(result) };
10733
+ }
10734
+ );
10735
+ registerTool(
10736
+ "reminders_active",
10737
+ {
10738
+ title: "Get active reminders",
10739
+ description: `Get active reminders that are pending, overdue, or due soon.
10740
+ Returns: reminders with urgency levels (overdue, due_soon, today, upcoming).
10741
+ Optionally provide context (e.g., current task description) to get contextually relevant reminders.
10742
+
10743
+ Use this to see what reminders need attention now.`,
10744
+ inputSchema: external_exports.object({
10745
+ workspace_id: external_exports.string().uuid().optional(),
10746
+ project_id: external_exports.string().uuid().optional(),
10747
+ context: external_exports.string().optional().describe("Optional context to match relevant reminders (e.g., current task)"),
10748
+ limit: external_exports.number().optional().describe("Maximum reminders to return (default: 10)")
10749
+ })
10750
+ },
10751
+ async (input) => {
10752
+ const result = await client.remindersActive({
10753
+ workspace_id: input.workspace_id,
10754
+ project_id: input.project_id,
10755
+ context: input.context,
10756
+ limit: input.limit
10757
+ });
10758
+ if (!result.reminders || result.reminders.length === 0) {
10759
+ return { content: [{ type: "text", text: "No active reminders." }] };
10760
+ }
10761
+ const formatted = result.reminders.map((r) => {
10762
+ const icon = r.urgency === "overdue" ? "\u{1F534}" : r.urgency === "due_soon" ? "\u{1F7E0}" : r.urgency === "today" ? "\u{1F7E1}" : "\u{1F535}";
10763
+ const priority = r.priority !== "normal" ? ` [${r.priority}]` : "";
10764
+ return `${icon} ${r.title}${priority}
10765
+ Due: ${new Date(r.remind_at).toLocaleString()}
10766
+ ${r.content_preview}`;
10767
+ }).join("\n\n");
10768
+ const header = result.overdue_count > 0 ? `\u26A0\uFE0F ${result.overdue_count} overdue reminder(s)
10769
+
10770
+ ` : "";
10771
+ return { content: [{ type: "text", text: header + formatted }], structuredContent: toStructured(result) };
10772
+ }
10773
+ );
10774
+ registerTool(
10775
+ "reminders_create",
10776
+ {
10777
+ title: "Create a reminder",
10778
+ description: `Create a new reminder for a specific date/time.
10779
+ Set reminders to be notified about tasks, follow-ups, or important dates.
10780
+
10781
+ Priority levels: low, normal, high, urgent
10782
+ Recurrence: daily, weekly, monthly (optional)
10783
+
10784
+ Example: Create a reminder to "Review PR #123" for tomorrow at 10am with high priority.`,
10785
+ inputSchema: external_exports.object({
10786
+ workspace_id: external_exports.string().uuid().optional(),
10787
+ project_id: external_exports.string().uuid().optional(),
10788
+ title: external_exports.string().describe("Reminder title (brief, descriptive)"),
10789
+ content: external_exports.string().describe("Reminder details/description"),
10790
+ remind_at: external_exports.string().describe('When to remind (ISO 8601 datetime, e.g., "2025-01-15T10:00:00Z")'),
10791
+ priority: external_exports.enum(["low", "normal", "high", "urgent"]).optional().describe("Priority level (default: normal)"),
10792
+ keywords: external_exports.array(external_exports.string()).optional().describe("Keywords for contextual surfacing"),
10793
+ recurrence: external_exports.enum(["daily", "weekly", "monthly"]).optional().describe("Recurrence pattern")
10794
+ })
10795
+ },
10796
+ async (input) => {
10797
+ const result = await client.remindersCreate({
10798
+ workspace_id: input.workspace_id,
10799
+ project_id: input.project_id,
10800
+ title: input.title,
10801
+ content: input.content,
10802
+ remind_at: input.remind_at,
10803
+ priority: input.priority,
10804
+ keywords: input.keywords,
10805
+ recurrence: input.recurrence
10806
+ });
10807
+ const due = new Date(result.remind_at).toLocaleString();
10808
+ return {
10809
+ content: [{ type: "text", text: `\u2705 Reminder created: "${result.title}"
10810
+ Due: ${due}
10811
+ Priority: ${result.priority}
10812
+ ID: ${result.id}` }],
10813
+ structuredContent: toStructured(result)
10814
+ };
10815
+ }
10816
+ );
10817
+ registerTool(
10818
+ "reminders_snooze",
10819
+ {
10820
+ title: "Snooze a reminder",
10821
+ description: `Snooze a reminder until a later time.
10822
+ Use this to postpone a reminder without dismissing it.
10823
+
10824
+ Common snooze durations:
10825
+ - 1 hour: add 1 hour to current time
10826
+ - 4 hours: add 4 hours
10827
+ - Tomorrow: next day at 9am
10828
+ - Next week: 7 days from now`,
10829
+ inputSchema: external_exports.object({
10830
+ reminder_id: external_exports.string().uuid().describe("ID of the reminder to snooze"),
10831
+ until: external_exports.string().describe("When to resurface the reminder (ISO 8601 datetime)")
10832
+ })
10833
+ },
10834
+ async (input) => {
10835
+ const result = await client.remindersSnooze({
10836
+ reminder_id: input.reminder_id,
10837
+ until: input.until
10838
+ });
10839
+ const snoozedUntil = new Date(result.snoozed_until).toLocaleString();
10840
+ return {
10841
+ content: [{ type: "text", text: `\u{1F634} Reminder snoozed until ${snoozedUntil}` }],
10842
+ structuredContent: toStructured(result)
10843
+ };
10844
+ }
10845
+ );
10846
+ registerTool(
10847
+ "reminders_complete",
10848
+ {
10849
+ title: "Complete a reminder",
10850
+ description: `Mark a reminder as completed.
10851
+ Use this when the task or action associated with the reminder is done.`,
10852
+ inputSchema: external_exports.object({
10853
+ reminder_id: external_exports.string().uuid().describe("ID of the reminder to complete")
10854
+ })
10855
+ },
10856
+ async (input) => {
10857
+ const result = await client.remindersComplete({
10858
+ reminder_id: input.reminder_id
10859
+ });
10860
+ return {
10861
+ content: [{ type: "text", text: `\u2705 Reminder completed!` }],
10862
+ structuredContent: toStructured(result)
10863
+ };
10864
+ }
10865
+ );
10866
+ registerTool(
10867
+ "reminders_dismiss",
10868
+ {
10869
+ title: "Dismiss a reminder",
10870
+ description: `Dismiss a reminder without completing it.
10871
+ Use this to remove a reminder that is no longer relevant.`,
10872
+ inputSchema: external_exports.object({
10873
+ reminder_id: external_exports.string().uuid().describe("ID of the reminder to dismiss")
10874
+ })
10875
+ },
10876
+ async (input) => {
10877
+ const result = await client.remindersDismiss({
10878
+ reminder_id: input.reminder_id
10879
+ });
10880
+ return {
10881
+ content: [{ type: "text", text: `\u{1F5D1}\uFE0F Reminder dismissed.` }],
10882
+ structuredContent: toStructured(result)
10883
+ };
10884
+ }
10885
+ );
10611
10886
  }
10612
10887
 
10613
10888
  // src/resources.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contextstream/mcp-server",
3
- "version": "0.3.49",
3
+ "version": "0.3.50",
4
4
  "description": "MCP server exposing ContextStream public API - code context, memory, search, and AI tools for developers",
5
5
  "type": "module",
6
6
  "license": "MIT",