@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.
- package/package.json +1 -1
- package/src/server.js +24 -9
package/package.json
CHANGED
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
|
-
-
|
|
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.
|
|
674
|
-
"in the repo (e.g.
|
|
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.
|
|
994
|
-
"
|
|
995
|
-
"
|
|
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"])
|