@contextstream/mcp-server 0.3.48 → 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 +350 -13
  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
@@ -7678,16 +7757,51 @@ function getCoreToolsHint() {
7678
7757
  var LESSON_DEDUP_WINDOW_MS = 2 * 60 * 1e3;
7679
7758
  var recentLessonCaptures = /* @__PURE__ */ new Map();
7680
7759
  var LIGHT_TOOLSET = /* @__PURE__ */ new Set([
7760
+ // Core session tools (13)
7681
7761
  "session_init",
7762
+ "session_tools",
7682
7763
  "context_smart",
7764
+ "session_summary",
7683
7765
  "session_capture",
7766
+ "session_capture_lesson",
7767
+ "session_get_lessons",
7684
7768
  "session_recall",
7685
7769
  "session_remember",
7770
+ "session_get_user_context",
7771
+ "session_smart_search",
7772
+ "session_compress",
7773
+ "session_delta",
7774
+ // Setup and configuration (3)
7775
+ "generate_editor_rules",
7776
+ "workspace_associate",
7777
+ "workspace_bootstrap",
7778
+ // Project management (5)
7779
+ "projects_create",
7780
+ "projects_list",
7781
+ "projects_get",
7782
+ "projects_overview",
7783
+ "projects_statistics",
7784
+ // Project indexing (4)
7785
+ "projects_ingest_local",
7786
+ "projects_index",
7787
+ "projects_index_status",
7788
+ "projects_files",
7789
+ // Memory basics (3)
7790
+ "memory_search",
7791
+ "memory_decisions",
7792
+ "memory_get_event",
7793
+ // Graph basics (2)
7794
+ "graph_related",
7795
+ "graph_decisions",
7796
+ // Reminders (2)
7797
+ "reminders_list",
7798
+ "reminders_active",
7799
+ // Utility (2)
7686
7800
  "auth_me",
7687
7801
  "mcp_server_version"
7688
7802
  ]);
7689
7803
  var STANDARD_TOOLSET = /* @__PURE__ */ new Set([
7690
- // Core session tools
7804
+ // Core session tools (13)
7691
7805
  "session_init",
7692
7806
  "session_tools",
7693
7807
  "context_smart",
@@ -7701,18 +7815,59 @@ var STANDARD_TOOLSET = /* @__PURE__ */ new Set([
7701
7815
  "session_smart_search",
7702
7816
  "session_compress",
7703
7817
  "session_delta",
7704
- // Setup and configuration
7818
+ // Setup and configuration (3)
7705
7819
  "generate_editor_rules",
7706
7820
  "workspace_associate",
7707
7821
  "workspace_bootstrap",
7822
+ // Workspace management (2)
7823
+ "workspaces_list",
7824
+ "workspaces_get",
7825
+ // Project management (6)
7708
7826
  "projects_create",
7709
7827
  "projects_list",
7710
- // Project indexing - essential for code context
7828
+ "projects_get",
7829
+ "projects_overview",
7830
+ "projects_statistics",
7831
+ "projects_update",
7832
+ // Project indexing (4)
7711
7833
  "projects_ingest_local",
7712
7834
  "projects_index",
7713
7835
  "projects_index_status",
7714
7836
  "projects_files",
7715
- // Utility
7837
+ // Memory events (9)
7838
+ "memory_search",
7839
+ "memory_decisions",
7840
+ "memory_create_event",
7841
+ "memory_list_events",
7842
+ "memory_get_event",
7843
+ "memory_update_event",
7844
+ "memory_delete_event",
7845
+ "memory_timeline",
7846
+ "memory_summary",
7847
+ // Memory nodes (2)
7848
+ "memory_create_node",
7849
+ "memory_list_nodes",
7850
+ // Knowledge graph analysis (8)
7851
+ "graph_related",
7852
+ "graph_decisions",
7853
+ "graph_path",
7854
+ "graph_dependencies",
7855
+ "graph_call_path",
7856
+ "graph_impact",
7857
+ "graph_circular_dependencies",
7858
+ "graph_unused_code",
7859
+ // Search (3)
7860
+ "search_semantic",
7861
+ "search_hybrid",
7862
+ "search_keyword",
7863
+ // Reminders (6)
7864
+ "reminders_list",
7865
+ "reminders_active",
7866
+ "reminders_create",
7867
+ "reminders_snooze",
7868
+ "reminders_complete",
7869
+ "reminders_dismiss",
7870
+ // Utility (2)
7716
7871
  "auth_me",
7717
7872
  "mcp_server_version"
7718
7873
  ]);
@@ -8775,8 +8930,8 @@ Automatically detects code files and skips ignored directories like node_modules
8775
8930
  "memory_get_event",
8776
8931
  {
8777
8932
  title: "Get memory event",
8778
- description: "Get a specific memory event by ID",
8779
- 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") })
8780
8935
  },
8781
8936
  async (input) => {
8782
8937
  const result = await client.getMemoryEvent(input.event_id);
@@ -10546,6 +10701,188 @@ Use this to verify integrations are healthy and syncing properly.`,
10546
10701
  return { content: [{ type: "text", text: formatted }], structuredContent: toStructured(result) };
10547
10702
  }
10548
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
+ );
10549
10886
  }
10550
10887
 
10551
10888
  // src/resources.ts
@@ -11437,12 +11774,12 @@ Created API key: ${maskApiKey(apiKey)}
11437
11774
  const modeChoice = normalizeInput(await rl.question("Choose [1/2] (default 1): ")) || "1";
11438
11775
  const mode = modeChoice === "2" ? "full" : "minimal";
11439
11776
  console.log("\nMCP toolset (which tools to expose to the AI):");
11440
- console.log(" 1) Light \u2014 minimal essential tools for fastest responses (~7 tools)");
11441
- console.log(" Best for: simple tasks, resource-constrained environments");
11442
- console.log(" 2) Standard (recommended) \u2014 balanced set of session and context tools (~20 tools)");
11443
- console.log(" Best for: most users, balances speed with capabilities");
11444
- console.log(" 3) Complete \u2014 all tools including memory, knowledge graph, AI, integrations (~86 tools)");
11445
- console.log(" Best for: power users needing full workspace/project/graph capabilities");
11777
+ console.log(" 1) Light \u2014 core session, project, and basic memory/graph tools (~30 tools)");
11778
+ console.log(" Best for: faster responses, simpler workflows, resource-constrained environments");
11779
+ console.log(" 2) Standard (recommended) \u2014 adds workspace, memory CRUD, graph analysis, search (~50 tools)");
11780
+ console.log(" Best for: most users, full development workflow with memory and code analysis");
11781
+ console.log(" 3) Complete \u2014 all tools including AI, GitHub, Slack integrations (~86 tools)");
11782
+ console.log(" Best for: power users needing integrations and advanced features");
11446
11783
  console.log("");
11447
11784
  console.log(" Tip: Change later by setting CONTEXTSTREAM_TOOLSET=light|standard|complete");
11448
11785
  const toolsetChoice = normalizeInput(await rl.question("Choose [1/2/3] (default 2): ")) || "2";
@@ -11730,7 +12067,7 @@ Applying to ${projects.length} project(s)...`);
11730
12067
  const skipped = writeActions.filter((a) => a.status === "skipped").length;
11731
12068
  const dry = writeActions.filter((a) => a.status === "dry-run").length;
11732
12069
  console.log(`Summary: ${created} created, ${updated} updated, ${appended} appended, ${skipped} skipped, ${dry} dry-run.`);
11733
- const toolsetDesc = toolset === "light" ? "~7 tools" : toolset === "complete" ? "~86 tools" : "~20 tools";
12070
+ const toolsetDesc = toolset === "light" ? "~30 tools" : toolset === "complete" ? "~86 tools" : "~50 tools";
11734
12071
  console.log(`Toolset: ${toolset} (${toolsetDesc})`);
11735
12072
  }
11736
12073
  console.log("\nNext steps:");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contextstream/mcp-server",
3
- "version": "0.3.48",
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",