@opennous/mcp 0.29.0 → 0.30.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/package.json +2 -2
  2. package/src/server.js +48 -2
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@opennous/mcp",
3
- "version": "0.29.0",
4
- "description": "Nous MCP Server Customer graph for GTM agents.",
3
+ "version": "0.30.0",
4
+ "description": "Nous the Context Graph for AI Agents.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
7
7
  "type": "git",
package/src/server.js CHANGED
@@ -41,7 +41,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
41
41
  import { z } from "zod";
42
42
  import { get, post } from "./client.js";
43
43
 
44
- export const SERVER_VERSION = "0.34.0";
44
+ export const SERVER_VERSION = "0.35.0";
45
45
 
46
46
  // ─── helpers ──────────────────────────────────────────────────────────────────
47
47
 
@@ -111,6 +111,7 @@ Nous first even when the user never says "Nous":
111
111
  - Something happened or you learned a fact -> record
112
112
  - Activity or a list across many accounts -> query
113
113
  - What needs attention, what has gone quiet -> attention
114
+ - Your action items / what you owe an account -> get_action_items
114
115
  - A fact looks stale before you act on it -> verify
115
116
  - Our ICP, market, pricing, positioning -> get_gtm_profile
116
117
  - Our own GTM shifted -> update_gtm_profile
@@ -127,7 +128,7 @@ export function createServer() {
127
128
  name: "nous",
128
129
  version: SERVER_VERSION,
129
130
  description:
130
- "Nous — the context layer for GTM agents. Nous is operated by the agent, not by a human " +
131
+ "Nous — the Context Graph for AI Agents. Nous is operated by the agent, not by a human " +
131
132
  "clicking around: call get_workspace_status at the start of a session to see what's set up " +
132
133
  "and what to set up next. Call get_context before drafting outreach or preparing for a " +
133
134
  "meeting. Call record after every interaction, or whenever you learn something.",
@@ -437,6 +438,51 @@ export function createServer() {
437
438
  }
438
439
  );
439
440
 
441
+ // ===========================================================================
442
+ // TOOL: get_action_items — GET /v2/action-items
443
+ // Commitments extracted from meetings/emails — what you owe each account.
444
+ // ===========================================================================
445
+ server.tool(
446
+ "get_action_items",
447
+ "Your open action items and commitments, pulled from meeting notes and emails — what you owe " +
448
+ "which account (and what they owe you), so you don't have to dig through transcripts. Use for " +
449
+ "'what are my action items', 'what do I owe <account>', 'what's outstanding this week'. Defaults " +
450
+ "to YOUR open items across all accounts, grouped by account.",
451
+ {
452
+ owner: z.enum(["me", "prospect", "all"]).optional().describe("Whose commitments — me (default), the prospect, or all"),
453
+ status: z.enum(["open", "done", "all"]).optional().describe("open (default), done, or all"),
454
+ focus: z.string().optional().describe("Scope to one account — an email or entity UUID"),
455
+ due: z.enum(["today", "week", "all"]).optional().describe("Only items due today / this week (items that carry a due date) — default all"),
456
+ },
457
+ async ({ owner, status, focus, due }) => {
458
+ const params = {};
459
+ if (owner) params.owner = owner;
460
+ if (status) params.status = status;
461
+ if (focus) params.focus = focus;
462
+ if (due) params.due = due;
463
+ const r = await get("/v2/action-items", params);
464
+ const items = r.items ?? [];
465
+ if (!items.length) return { content: [{ type: "text", text: "No matching action items." }] };
466
+
467
+ const byAccount = new Map();
468
+ for (const it of items) {
469
+ const key = it.account || it.account_email || it.entity_id || "—";
470
+ if (!byAccount.has(key)) byAccount.set(key, []);
471
+ byAccount.get(key).push(it);
472
+ }
473
+ const lines = [`${items.length} action item${items.length !== 1 ? "s" : ""}:`];
474
+ for (const [account, list] of byAccount) {
475
+ lines.push(`\n${account}:`);
476
+ for (const it of list) {
477
+ const who = it.owner_kind === "prospect" ? "[them]" : "[you]";
478
+ const when = it.due_at ? ` (due ${fmtWhen(it.due_at)})` : "";
479
+ lines.push(` ${who} ${it.title}${when}`);
480
+ }
481
+ }
482
+ return { content: [{ type: "text", text: lines.join("\n") }] };
483
+ }
484
+ );
485
+
440
486
  // ===========================================================================
441
487
  // TOOL: verify — POST /v2/verify
442
488
  // Re-check a fact before acting on it — the calibration check.