@opennous/mcp 0.43.0 → 0.44.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 +15 -15
package/package.json
CHANGED
package/src/server.js
CHANGED
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
* search_notes — semantic search over saved notes & documents
|
|
24
24
|
* get_workspace_status — what's set up in this workspace + a ranked next_steps list (call first)
|
|
25
25
|
* set_workspace_profile— agent-driven onboarding: set the workspace's name, site, type, ICP
|
|
26
|
-
*
|
|
27
|
-
*
|
|
26
|
+
* build_icp_model — build/rebuild the ICP scoring model from the recorded GTM context
|
|
27
|
+
* train_icp_model — build the ICP model from real closed-won/lost deals (contrastive lift)
|
|
28
28
|
* sync_icp — sync the user's EXISTING ICP/positioning files into Nous (file → graph)
|
|
29
29
|
* export_icp_model — get the learned ICP model as a block to write back into their ICP file (graph → file)
|
|
30
30
|
* connect_integration — connect a key-based integration (Apollo, Prospeo, HubSpot, …)
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
* list_triggers — list the workspace's event triggers + available events
|
|
35
35
|
* get_routing_preferences — Claude Code routing prefs to default GTM to Nous (write to CLAUDE.md)
|
|
36
36
|
* lead_list_operations — the operations trail of a lead list (imports/enrich/push/replies), filterable
|
|
37
|
-
*
|
|
37
|
+
* get_coverage — pre-spend coverage: exact per-lead check (identifiers) or attribute estimate (title/keyword)
|
|
38
38
|
* enrich_leads — find missing emails for a lead list (two-step: dry-run cost preview, then confirm)
|
|
39
39
|
* verify_leads — validate email deliverability for a lead list (two-step preview, then confirm)
|
|
40
40
|
*/
|
|
@@ -905,14 +905,14 @@ export function createServer() {
|
|
|
905
905
|
);
|
|
906
906
|
|
|
907
907
|
// ===========================================================================
|
|
908
|
-
// TOOL:
|
|
908
|
+
// TOOL: build_icp_model — POST /v2/workspace/scoring-model
|
|
909
909
|
// The second half of building the GTM playbook. The agent syncs the GTM context
|
|
910
910
|
// from the user's files with sync_icp, then calls this to turn it into a weighted
|
|
911
911
|
// ICP scoring model. After this, accounts get scored for fit and
|
|
912
912
|
// get_workspace_status shows the playbook as done.
|
|
913
913
|
// ===========================================================================
|
|
914
914
|
server.tool(
|
|
915
|
-
"
|
|
915
|
+
"build_icp_model",
|
|
916
916
|
"Build (or rebuild) the user's ICP scoring model from their synced GTM context. This is " +
|
|
917
917
|
"the second half of setting up the GTM playbook: first sync the user's ICP/positioning/pricing " +
|
|
918
918
|
"files with sync_icp, then call this to translate that context into a weighted set of scoring " +
|
|
@@ -921,7 +921,7 @@ export function createServer() {
|
|
|
921
921
|
"pass force:true (use that when the context files have changed and the model should be rebuilt). If " +
|
|
922
922
|
"it reports no GTM context yet, sync the user's context files with sync_icp first, then call this again. " +
|
|
923
923
|
"STRONGER than this tool: if the user can name a few closed-WON and closed-LOST customer domains, " +
|
|
924
|
-
"call
|
|
924
|
+
"call train_icp_model instead (or as well) — it trains the model on real outcomes via " +
|
|
925
925
|
"contrastive lift, which beats a model inferred from a description.",
|
|
926
926
|
{
|
|
927
927
|
force: z.boolean().optional()
|
|
@@ -945,7 +945,7 @@ export function createServer() {
|
|
|
945
945
|
}
|
|
946
946
|
if (msg.includes("model_exists")) {
|
|
947
947
|
return { content: [{ type: "text", text:
|
|
948
|
-
"A scoring model already exists. Call
|
|
948
|
+
"A scoring model already exists. Call build_icp_model again with force:true to rebuild it from the current GTM context." }] };
|
|
949
949
|
}
|
|
950
950
|
throw e;
|
|
951
951
|
}
|
|
@@ -953,11 +953,11 @@ export function createServer() {
|
|
|
953
953
|
);
|
|
954
954
|
|
|
955
955
|
// ===========================================================================
|
|
956
|
-
// TOOL:
|
|
956
|
+
// TOOL: train_icp_model — POST /v2/workspace/closed-deals
|
|
957
957
|
// Build the ICP model from REAL outcomes via contrastive lift (won vs lost).
|
|
958
958
|
// ===========================================================================
|
|
959
959
|
server.tool(
|
|
960
|
-
"
|
|
960
|
+
"train_icp_model",
|
|
961
961
|
"Build (or sharpen) the ICP scoring model from the user's REAL closed deals. Pass closed-WON " +
|
|
962
962
|
"customer domains and closed-LOST domains; Nous enriches each, links the contacts you already " +
|
|
963
963
|
"have there, and runs contrastive lift (what's true of winners but not losers) to discover the " +
|
|
@@ -1049,7 +1049,7 @@ export function createServer() {
|
|
|
1049
1049
|
const sig = r.signals ?? [];
|
|
1050
1050
|
if (r.model_status === "created" && sig.length) {
|
|
1051
1051
|
lines.push("", `Built the ICP scoring model — ${sig.length} signal${sig.length === 1 ? "" : "s"}.`);
|
|
1052
|
-
lines.push("Next: if the user can name a few closed-won + closed-lost domains, call
|
|
1052
|
+
lines.push("Next: if the user can name a few closed-won + closed-lost domains, call train_icp_model to sharpen it on real outcomes, then call export_icp_model to write the learned model back into their ICP file.");
|
|
1053
1053
|
} else if (r.model_status === "no_icp_memory") {
|
|
1054
1054
|
lines.push("", "Synced, but there wasn't enough ICP content to build a scoring model — make sure the ICP section has real content.");
|
|
1055
1055
|
} else {
|
|
@@ -1082,7 +1082,7 @@ export function createServer() {
|
|
|
1082
1082
|
"calibration gap) as a ready-to-write markdown block, and write it back into the user's own ICP " +
|
|
1083
1083
|
"file. This is the payoff of the symbiosis: their file keeps the words, Nous keeps the model, and " +
|
|
1084
1084
|
"this writes the model under their words. CLAUDE CODE flow: call this after sync_icp or after " +
|
|
1085
|
-
"
|
|
1085
|
+
"train_icp_model, then with your file tools open `target_path`, and if the file already has a " +
|
|
1086
1086
|
"block between '<!-- nous:icp start -->' and '<!-- nous:icp end -->' REPLACE that whole block with " +
|
|
1087
1087
|
"the returned `block`; if not, append the returned `block` (e.g. replacing a '## [To refine]' " +
|
|
1088
1088
|
"placeholder). Never edit inside the markers by hand — this tool regenerates them. Everything " +
|
|
@@ -1093,11 +1093,11 @@ export function createServer() {
|
|
|
1093
1093
|
if (!r.has_model) {
|
|
1094
1094
|
return { content: [{ type: "text", text:
|
|
1095
1095
|
"No ICP scoring model yet. Sync the user's ICP file with sync_icp first (or build one with " +
|
|
1096
|
-
"
|
|
1096
|
+
"build_icp_model / train_icp_model), then call this to write it back." }] };
|
|
1097
1097
|
}
|
|
1098
1098
|
const note = r.has_outcomes
|
|
1099
1099
|
? "This model is trained on real closed deals (lift + calibration shown)."
|
|
1100
|
-
: "This model is seeded from the ICP only — add closed deals with
|
|
1100
|
+
: "This model is seeded from the ICP only — add closed deals with train_icp_model to sharpen it.";
|
|
1101
1101
|
return { content: [{ type: "text", text:
|
|
1102
1102
|
`Write the block below into ${r.target_path} with your file editor — replace any existing block ` +
|
|
1103
1103
|
`between the nous:icp markers, or append it if there's none (create the file/section if absent). ` +
|
|
@@ -1316,14 +1316,14 @@ export function createServer() {
|
|
|
1316
1316
|
);
|
|
1317
1317
|
|
|
1318
1318
|
// ===========================================================================
|
|
1319
|
-
// TOOL:
|
|
1319
|
+
// TOOL: get_coverage — POST /v2/dedup (exact) | GET /v2/people/coverage (estimate)
|
|
1320
1320
|
// "What do I already have?" before spending on a list elsewhere. One tool, two
|
|
1321
1321
|
// modes: pass identifiers for an EXACT per-lead net-new/re-enrich/reuse check
|
|
1322
1322
|
// (the pre-spend gate), or a title/keyword for a rough attribute ESTIMATE.
|
|
1323
1323
|
// (Replaces the former check_leads + lead_coverage tools.)
|
|
1324
1324
|
// ===========================================================================
|
|
1325
1325
|
server.tool(
|
|
1326
|
-
"
|
|
1326
|
+
"get_coverage",
|
|
1327
1327
|
"(Nous Cloud only) Check what you ALREADY have before spending on a list elsewhere (Apollo, Sales Navigator, Clay). " +
|
|
1328
1328
|
"Two modes:\n" +
|
|
1329
1329
|
" • EXACT — pass candidate identifiers (emails / linkedin_urls / domains, free in any tool's " +
|