@opennous/mcp 0.39.0 → 0.41.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 +1 -1
  2. package/src/server.js +24 -9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opennous/mcp",
3
- "version": "0.39.0",
3
+ "version": "0.41.0",
4
4
  "description": "Nous — the Context Graph for AI Agents.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
package/src/server.js CHANGED
@@ -117,12 +117,19 @@ Nous first even when the user never says "Nous":
117
117
  - A fact looks stale before you act on it -> verify
118
118
  - Our ICP, market, pricing, positioning -> get_gtm_profile
119
119
  - Our ICP/positioning lives in our own files -> get_icp (file → graph) / get_icp_model (graph → file)
120
- - Our own GTM shifted (repriced, repositioned) -> edit the context file, then re-run get_icp
120
+ - You edited an ICP / context / playbook file -> re-sync THIS turn: get_icp (ICP/context) or sync_playbook (a playbook)
121
121
  - A brief / note / transcript on a contact -> save_note / search_notes
122
122
  - What's set up here and what to do next -> get_workspace_status
123
123
 
124
124
  Read get_gtm_profile at the start of GTM work and write back what changed at the
125
- end. After every interaction you help with, call record so the record stays current.`;
125
+ end. After every interaction you help with, call record so the record stays current.
126
+
127
+ CRITICAL — edits don't apply until you sync. Editing an ICP / context / playbook
128
+ file (context/icp.md, positioning.md, references/voice.md, …) does NOT change the
129
+ ICP score, the exclusions, or what any other agent reads until it is synced into
130
+ the graph. After ANY such edit you MUST call get_icp (for ICP/context files) or
131
+ sync_playbook (for a playbook) in the SAME turn. Never leave an edited file
132
+ unsynced — an unsynced edit is silently inert.`;
126
133
 
127
134
  // ─── factory ──────────────────────────────────────────────────────────────────
128
135
 
@@ -661,7 +668,7 @@ export function createServer() {
661
668
 
662
669
  const syncPlaybookSchema = {
663
670
  kind: z.enum(["voice", "outreach", "icp", "positioning"]).describe("Which playbook to update."),
664
- body_md: z.string().describe("The full markdown content of the playbook."),
671
+ body_md: z.string().describe("The full markdown content of the playbook. Follow the Nous document house style so every playbook reads like a clean text file: a '# Title' line, a '> ' one-paragraph lede, an optional plain 'Key: value' block, a '---' divider, then '## Title-case' sections with plain '- ' bullets. Keep it markdown, no decorative formatting."),
665
672
  file_path: z.string().optional().describe("The repo file this mirrors, e.g. 'context/icp/icp.md'. Pass it when syncing a Claude Code file so the source is recorded as the file."),
666
673
  };
667
674
  const syncPlaybookHandler = async ({ kind, body_md, file_path }) => {
@@ -670,9 +677,11 @@ export function createServer() {
670
677
  `Synced the ${r.playbook?.kind || kind} playbook into Nous (v${r.playbook?.version}). Other agents now read the same rules.` }] };
671
678
  };
672
679
  server.tool("sync_playbook",
673
- "Push a playbook's content into Nous so the graph stays current. Call this AFTER you edit a policy file " +
674
- "in the repo (e.g. context/icp/icp.md, references/voice.md), passing the file's new content and its path, " +
675
- "so Nous mirrors it and every other agent obeys the same rules.",
680
+ "Push a playbook's content into Nous so the graph stays current. You MUST call this in the SAME turn " +
681
+ "whenever you edit a policy file in the repo (e.g. references/voice.md, outreach rules), passing the " +
682
+ "file's new content and its path, so Nous mirrors it and every other agent obeys the same rules. An " +
683
+ "edited playbook file that isn't synced is silently inert — other agents keep reading the old rules. " +
684
+ "(For the ICP/context files specifically, get_icp is the sync — use that one.)",
676
685
  syncPlaybookSchema, syncPlaybookHandler);
677
686
 
678
687
  // The GTM context is no longer written through a dedicated MCP tool. In the file
@@ -986,13 +995,19 @@ export function createServer() {
986
995
  "If one file holds several sections under headers, split it by header into multiple entries. " +
987
996
  "Nous keeps a served copy of the prose and rebuilds the ICP scoring model from it; " +
988
997
  "the recorded source_path is what get_icp_model writes the learned model back into. " +
998
+ "INCLUDE EXCLUSIONS: if the ICP names who they will NOT work with (e.g. 'not cold-calling " +
999
+ "agencies', 'no pure branding/messaging shops'), keep that text IN the ICP section — Nous turns " +
1000
+ "each stated exclusion into a hard disqualifier that caps those accounts below Not-ICP, even when " +
1001
+ "they also match the firmographics. So a 'Not a fit' list in icp.md actively lowers their score. " +
989
1002
  "IF NO ICP FILES EXIST: don't invent context in Nous. Offer to SCAFFOLD a context/ folder in their " +
990
1003
  "repo — context/icp.md, positioning.md, pricing.md, market.md, competitors.md, gtm-motion.md — " +
991
1004
  "filled from what the user tells you plus your own research of their website (write them with your " +
992
1005
  "file tools), then call this on those files — so their GTM context lives in their repo where they'll " +
993
- "keep editing it. At minimum create context/icp.md if that's all they'll give you. Re-run this after " +
994
- "the user edits any context file to re-sync. The ICP section's source_path matters most (it's the " +
995
- "write-back target for get_icp_model).",
1006
+ "keep editing it. At minimum create context/icp.md if that's all they'll give you. " +
1007
+ "MANDATORY RE-SYNC: whenever you (or the user) edit the ICP/context file add or change an exclusion, " +
1008
+ "reword the ICP, retarget — you MUST call get_icp again in the SAME turn. The edit does NOT change the " +
1009
+ "ICP score, the exclusions, or the scoring model until you do; an unsynced file edit is silently inert. " +
1010
+ "The ICP section's source_path matters most (it's the write-back target for get_icp_model).",
996
1011
  {
997
1012
  sections: z.array(z.object({
998
1013
  section: z.enum(["ICP", "Market", "Product", "Pricing", "Competitors", "Positioning", "GTM Motion", "Notes"])