@opennous/mcp 0.57.0 → 0.58.1

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 +31 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opennous/mcp",
3
- "version": "0.57.0",
3
+ "version": "0.58.1",
4
4
  "description": "Nous — the Context Graph for AI Agents.",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
package/src/server.js CHANGED
@@ -92,10 +92,10 @@ export function createServer() {
92
92
  // Reads: get_context · get_account · query (search folds in via facts:true) · score.
93
93
  // Identity: whoami (who the key acts as, scope, GTM role[s]) — the governance
94
94
  // substrate. record_signal folds into record; save_note is out. The `tool()` guard
95
- // keeps the surface locked to these seven — a stray non-primitive registration is
95
+ // keeps the surface locked to these eight — a stray non-primitive registration is
96
96
  // dropped, not exposed. See docs/revenue-plugin/README.md §2–3.
97
97
  const PLUGIN_TOOLS = new Set([
98
- "record", "record_insight", "get_context", "get_account", "query", "score", "whoami",
98
+ "record", "record_insight", "get_context", "get_account", "query", "score", "whoami", "set_icp",
99
99
  ]);
100
100
  const _tool = server.tool.bind(server);
101
101
  const tool = (name, ...rest) => {
@@ -357,7 +357,9 @@ export function createServer() {
357
357
  "about the contact — a preference, an objection, a competitor they mentioned, a general note — " +
358
358
  "use property:'intel' with a category: {kind:'state',property:'intel',value:{category:'objection'," +
359
359
  "content:'skeptical about market demand',label:'Market demand skepticism'}} (category ∈ " +
360
- "preference | objection | competitor | buying_signal | budget | timing | authority | general). " +
360
+ "status_quo | goal | pain | objection | authority | budget | timeline | buying_signal | " +
361
+ "preference | competitor | discovery | relationship | general — use the MOST specific one; " +
362
+ "'general' is a last resort, and it's 'timeline', never 'timing'). " +
361
363
  "Insights about YOUR OWN business (product/positioning/market/buyer) go to record_insight, not here.",
362
364
  {
363
365
  focus: z.string().describe("Email address, LinkedIn URL, domain, or entity UUID — a precise identifier, never a bare name"),
@@ -420,6 +422,32 @@ export function createServer() {
420
422
  }
421
423
  );
422
424
 
425
+ // ===========================================================================
426
+ // TOOL: set_icp — POST /v2/foundations/icp
427
+ // Establish/replace the workspace's ICP (the scoring model). ICP setup happens
428
+ // entirely in onboarding: the agent authors the buyer definition + scoring rules
429
+ // and writes them here; the engine compiles the model that `score` reads.
430
+ // ===========================================================================
431
+ tool(
432
+ "set_icp",
433
+ "Set (or replace) this workspace's ICP — the scoring model every account is judged against. Pass " +
434
+ "the full ICP as markdown (body_md): who the ideal customer is, plus the scoring rules (a base, " +
435
+ "persona weights, firmographic weights, observed-signal boosts/cuts, and hard disqualifiers). The " +
436
+ "engine compiles it into the model `score`, get_context, and the reports use. Use this during " +
437
+ "onboarding to establish the ICP for a fresh workspace — whoami's setup.has_icp tells you whether " +
438
+ "one exists. Writing replaces the prior ICP, so if one already exists, read/confirm before " +
439
+ "overwriting. Authoring guide + required sections: the onboard skill's icp-authoring reference.",
440
+ {
441
+ body_md: z.string().describe("the full ICP as markdown — the buyer definition + the scoring rules (see the icp-authoring reference for the required sections)"),
442
+ },
443
+ async ({ body_md }) => {
444
+ const r = await post("/v2/foundations/icp", { body_md });
445
+ return { content: [{ type: "text", text:
446
+ `ICP saved${r.version ? ` (v${r.version})` : ""} — the scoring model is compiling from it. ` +
447
+ `score / get_context now judge accounts against this ICP.` }] };
448
+ }
449
+ );
450
+
423
451
  // ===========================================================================
424
452
  // TOOL: query — POST /v2/query
425
453
  // Retrieve a corpus of activity across many people. You do the analysis.