@clien-ai/mcp 0.2.1 → 0.4.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/README.md +124 -14
- package/dist/auth/oauth.js +69 -39
- package/dist/auth/oauth.js.map +1 -1
- package/dist/server.js +47 -9
- package/dist/server.js.map +1 -1
- package/dist/tools/collections.js +440 -0
- package/dist/tools/collections.js.map +1 -0
- package/dist/tools/interview.js +249 -25
- package/dist/tools/interview.js.map +1 -1
- package/dist/tools/output-schemas.js +130 -0
- package/dist/tools/output-schemas.js.map +1 -0
- package/dist/tools/param-aliases.js +144 -0
- package/dist/tools/param-aliases.js.map +1 -0
- package/dist/tools/personas.js +556 -44
- package/dist/tools/personas.js.map +1 -1
- package/dist/tools/projects.js +554 -6
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/registry.js +327 -37
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/report-digest.js +531 -0
- package/dist/tools/report-digest.js.map +1 -0
- package/dist/tools/reports.js +11 -1
- package/dist/tools/reports.js.map +1 -1
- package/dist/tools/research.js +12 -1
- package/dist/tools/research.js.map +1 -1
- package/dist/tools/scoped-research.js +19 -3
- package/dist/tools/scoped-research.js.map +1 -1
- package/dist/tools/status.js +12 -1
- package/dist/tools/status.js.map +1 -1
- package/dist/types/report.js +180 -2
- package/dist/types/report.js.map +1 -1
- package/dist/util/single-flight.js +63 -0
- package/dist/util/single-flight.js.map +1 -0
- package/package.json +1 -1
package/dist/tools/registry.js
CHANGED
|
@@ -13,24 +13,74 @@
|
|
|
13
13
|
* tests working.
|
|
14
14
|
*/
|
|
15
15
|
import { zodToInputSchema } from './schema.js';
|
|
16
|
+
import { normalizeParamAliases } from './param-aliases.js';
|
|
16
17
|
import { ResearchInputSchema, runResearch } from './research.js';
|
|
17
18
|
import { StatusInputSchema, getResearchStatus } from './status.js';
|
|
18
|
-
import { ListProjectsInputSchema, CreateProjectInputSchema, listProjects, createProject, } from './projects.js';
|
|
19
|
-
import { CreatePersonaInputSchema, createPersona, GeneratePersonaInputSchema, generatePersona, EnrichPersonaInputSchema, enrichPersona, } from './personas.js';
|
|
19
|
+
import { ListProjectsInputSchema, CreateProjectInputSchema, GetProjectInputSchema, listProjects, createProject, getProject, } from './projects.js';
|
|
20
|
+
import { CreatePersonaInputSchema, CREATE_PERSONA_ALIASES, createPersona, GeneratePersonaInputSchema, GENERATE_PERSONA_ALIASES, generatePersona, EnrichPersonaInputSchema, ENRICH_PERSONA_ALIASES, enrichPersona, ListPersonasInputSchema, listPersonas, GetPersonaInputSchema, getPersona, UpdatePersonaInputSchema, UPDATE_PERSONA_ALIASES, updatePersona, } from './personas.js';
|
|
20
21
|
import { ListReportsInputSchema, GetReportInputSchema, listReports, getReport, } from './reports.js';
|
|
21
|
-
import { InterviewPersonaInputSchema, interviewPersona } from './interview.js';
|
|
22
|
+
import { InterviewPersonaInputSchema, INTERVIEW_PERSONA_ALIASES, interviewPersona, ListInterviewsInputSchema, listInterviews, GetInterviewInputSchema, getInterview, } from './interview.js';
|
|
22
23
|
import { ScanCompetitorsInputSchema, scanCompetitors, SearchForumsInputSchema, searchForums, } from './scoped-research.js';
|
|
24
|
+
import { ListCompetitorsInputSchema, listCompetitors, ListCommunitySignalsInputSchema, listCommunitySignals, } from './collections.js';
|
|
25
|
+
import { GET_PERSONA_OUTPUT_SCHEMA, GET_REPORT_OUTPUT_SCHEMA, GET_INTERVIEW_OUTPUT_SCHEMA, LIST_PERSONAS_OUTPUT_SCHEMA, LIST_PROJECTS_OUTPUT_SCHEMA, LIST_INTERVIEWS_OUTPUT_SCHEMA, LIST_REPORTS_OUTPUT_SCHEMA, LIST_COMPETITORS_OUTPUT_SCHEMA, LIST_COMMUNITY_SIGNALS_OUTPUT_SCHEMA, } from './output-schemas.js';
|
|
26
|
+
/**
|
|
27
|
+
* `paramAliases` defaults to `{}` — a tool with no legacy spellings declares
|
|
28
|
+
* nothing. The handler is wrapped rather than each tool calling the normalizer
|
|
29
|
+
* itself: that keeps alias rewriting impossible to forget and keeps every
|
|
30
|
+
* handler seeing canonical snake_case keys only.
|
|
31
|
+
*
|
|
32
|
+
* The wrapper is `async` so that `normalizeParamAliases` throwing on an
|
|
33
|
+
* ambiguous input surfaces as a REJECTED PROMISE, not a synchronous throw —
|
|
34
|
+
* `ToolDefinition.handler` promises `Promise<ToolResult>`, and a caller that
|
|
35
|
+
* relies on `.catch()` rather than try/catch must not be blindsided.
|
|
36
|
+
*
|
|
37
|
+
* The same wrapper also DISCHARGES the `outputSchema` obligation (FUL-243). MCP
|
|
38
|
+
* requires that a tool declaring an `outputSchema` return conforming
|
|
39
|
+
* `structuredContent`; rather than trusting nine handlers to remember, the
|
|
40
|
+
* wrapper fills it from the handler's `_meta` whenever a schema is declared. The
|
|
41
|
+
* two therefore cannot drift: you cannot add a schema and forget the payload, and
|
|
42
|
+
* a tool with no schema never gains a stray structured result.
|
|
43
|
+
*
|
|
44
|
+
* `_meta` is the right source because for every tool that declares a schema it
|
|
45
|
+
* ALREADY holds exactly the structured payload — `structuredContent` is a new
|
|
46
|
+
* delivery channel for it, not new data. `_meta` is left in place unchanged for
|
|
47
|
+
* back-compat with anything already reading it.
|
|
48
|
+
*
|
|
49
|
+
* `?? {}` rather than skipping: a schema-carrying tool that somehow returned no
|
|
50
|
+
* `_meta` must still emit `structuredContent`, and `{}` satisfies every schema
|
|
51
|
+
* here whose `required` fields are all handler-guaranteed. A handler that
|
|
52
|
+
* genuinely cannot produce its payload throws instead, and error results are
|
|
53
|
+
* exempt from the obligation per spec.
|
|
54
|
+
*/
|
|
23
55
|
function defineTool(def) {
|
|
24
|
-
|
|
56
|
+
const paramAliases = def.paramAliases ?? {};
|
|
57
|
+
const inner = def.handler;
|
|
58
|
+
const { outputSchema } = def;
|
|
59
|
+
return {
|
|
60
|
+
...def,
|
|
61
|
+
paramAliases,
|
|
62
|
+
jsonSchema: zodToInputSchema(def.zodSchema),
|
|
63
|
+
handler: async (args, deps) => {
|
|
64
|
+
const result = await inner(normalizeParamAliases(args, paramAliases), deps);
|
|
65
|
+
if (!outputSchema)
|
|
66
|
+
return result;
|
|
67
|
+
return { ...result, structuredContent: result.structuredContent ?? result._meta ?? {} };
|
|
68
|
+
},
|
|
69
|
+
};
|
|
25
70
|
}
|
|
26
71
|
export const TOOLS = [
|
|
27
72
|
defineTool({
|
|
28
73
|
name: 'clien_research',
|
|
29
74
|
description: 'Run a full product-research pass on an idea — the recommended default for validating ' +
|
|
30
|
-
'a new idea end to end. Returns a markdown report
|
|
31
|
-
'
|
|
32
|
-
'
|
|
33
|
-
'
|
|
75
|
+
'a new idea end to end. Returns a markdown report, FOLLOWED IN THE SAME TEXT by a ' +
|
|
76
|
+
'machine-checked TRUST DIGEST — read the digest rather than trusting the prose. It states ' +
|
|
77
|
+
'every claim\'s GROUNDED / SPECULATION / NO_RECEIPT state with its receipt id, the separate ' +
|
|
78
|
+
'market/competitor spine, which personas are ⚠️ QA-FLAGGED, the anti-sycophancy readout, and ' +
|
|
79
|
+
'which hypothesis verdicts FLIPPED under rephrasing (with the downgraded verdict to act on ' +
|
|
80
|
+
'instead). When a section is missing the digest says so — absent is not clean. ' +
|
|
81
|
+
'The full structured report_data (hypotheses, competitors[], key findings) is also in ' +
|
|
82
|
+
'`_meta.report_data` for programmatic use; the digest already carries what you need to reason. ' +
|
|
83
|
+
'report_data carries this same typed TRUST layer: ' +
|
|
34
84
|
'(1) `claims[]` — each has a GROUNDED / SPECULATION / NO_RECEIPT state; a GROUNDED claim carries a ' +
|
|
35
85
|
'`sourceId` of the form "RCP-p{i}-s{j}" that indexes `personas[i].sources[j]` directly, so you can ' +
|
|
36
86
|
'follow any claim to the exact cached forum post that backs it. NO_RECEIPT can mean a bad claim OR ' +
|
|
@@ -40,9 +90,25 @@ export const TOOLS = [
|
|
|
40
90
|
'e.g. 3/3); when `flipped` is true, trust `robustness.downgradedStatus` as the real verdict, NOT the ' +
|
|
41
91
|
'top-level `status`. ' +
|
|
42
92
|
'(3) `personas[]` — besides `sources[]` receipts, check `qaFlagged` (persona failed a quality check) ' +
|
|
43
|
-
'before relying on its claims. ' +
|
|
93
|
+
'before relying on its claims. Two DIFFERENT grounding models ride here: forum `sources[]` are ' +
|
|
94
|
+
'receipt-eligible clickable posts, whereas `identityProvenance` (when present) is a PII-free ' +
|
|
95
|
+
'aggregate calibration line ("calibrated against N real ICP profiles") — NEVER a receipt, so do ' +
|
|
96
|
+
'not treat it as a source URL; `identityPriors` (seniority + career path) is typed enrichment, not a receipt either. ' +
|
|
44
97
|
'(4) `sycophancySignals` — broken-persona flags (`lowDiscrimination`), disagreement splits, and ' +
|
|
45
98
|
'explicit `totalRejections`. ' +
|
|
99
|
+
'(5) `reportClaims[]` — the SEPARATE market/competitor spine (never crosses the persona one): each ' +
|
|
100
|
+
'GROUNDED / SPECULATION / NO_RECEIPT, and a GROUNDED claim\'s `sourceId` of the form "RRCP-s{n}" ' +
|
|
101
|
+
'indexes `reportEvidence[n]` (its own pool), so a market/competitor figure follows to the cached ' +
|
|
102
|
+
'source page a verbatim span was matched against. On THIS spine a NO_RECEIPT claim carries one of ' +
|
|
103
|
+
'two provenance readings: if it has an `attestation` marker ({sourceId, quote}) it is ' +
|
|
104
|
+
'"Model-attested" — Claude read a supporting page and an independent check vouched it supports the ' +
|
|
105
|
+
'figure, though no exact quote could be pinned (stronger than recall, but NOT a verified receipt; ' +
|
|
106
|
+
'its `attestation.sourceId` indexes `reportEvidence[n]` the same way, but a marker\'s presence NEVER ' +
|
|
107
|
+
'implies grounding — key on `state`, not on whether a sourceId is present); ' +
|
|
108
|
+
'otherwise it is "from model knowledge — unverified": an evidence-shaped figure Claude wrote from ' +
|
|
109
|
+
'its own training knowledge that could not be verified against a source — often directionally right ' +
|
|
110
|
+
'(a recalled analyst estimate), but treat it as unconfirmed, NOT as a checked fact. Neither reading ' +
|
|
111
|
+
'is ever counted as grounded. ' +
|
|
46
112
|
'Typical wall time 15-25 minutes; progress ' +
|
|
47
113
|
'is streamed via notifications/progress. ' +
|
|
48
114
|
'This hero tool runs the whole curated pipeline in one call. PREFER it over hand-assembling ' +
|
|
@@ -66,8 +132,11 @@ export const TOOLS = [
|
|
|
66
132
|
description: 'Fetch the current state of an existing `clien_research` job. Use this to ' +
|
|
67
133
|
'recover a run that disconnected with -32000 mid-flight (the job keeps running ' +
|
|
68
134
|
'on the backend; this tool re-attaches a read view) and to poll for completion. ' +
|
|
69
|
-
'If the job is complete, returns the full markdown report
|
|
70
|
-
'
|
|
135
|
+
'If the job is complete, returns the full markdown report — followed in the same text by the ' +
|
|
136
|
+
'same machine-checked TRUST DIGEST `clien_research` renders (claim states + receipt ids, ' +
|
|
137
|
+
'QA-flagged personas, anti-sycophancy readout, flipped verdicts) — plus structured ' +
|
|
138
|
+
'report_data in `_meta`, the same shape `clien_research` would have returned. A recovered run ' +
|
|
139
|
+
'therefore loses none of the trust signal a completed run would have shown. ' +
|
|
71
140
|
'If the job is still running, returns a brief status summary. If the job failed or ' +
|
|
72
141
|
'was cancelled, returns the failure reason. ' +
|
|
73
142
|
'RECOVERY WITHOUT A JOB_ID: if the -32000 drop left you with no job_id, call this tool ' +
|
|
@@ -85,12 +154,24 @@ export const TOOLS = [
|
|
|
85
154
|
'to the full clien_research report when you only need the COMPETITOR dimension. Runs one web ' +
|
|
86
155
|
'researcher (not the whole H1-H8 pipeline): typical wall time 2-10 minutes, progress streamed ' +
|
|
87
156
|
'via notifications/progress. Returns a structured list of competitors in `_meta.competitors` — ' +
|
|
88
|
-
'each with name, url, description, pricing, strengths[], weaknesses[],
|
|
89
|
-
'plus a
|
|
157
|
+
'each with name, url, description, pricing, strengths[], weaknesses[], relevantHypotheses[], ' +
|
|
158
|
+
'and the four company facts (`funding`, `employeeCount`, `founded`, `hqLocation`) — plus a ' +
|
|
159
|
+
'readable summary. ' +
|
|
160
|
+
'TRUST: those four company facts are UN-RECEIPTED here — this tool stores the value the ' +
|
|
161
|
+
'researcher wrote, not the URL it came from, and attaches no grounding object to any of ' +
|
|
162
|
+
'them. Treat all four as unverified, and do not cite them as source-checked. The surface ' +
|
|
163
|
+
'that DOES carry per-fact provenance is `list_competitors`, where each of the same four ' +
|
|
164
|
+
'facts has a sibling `<fact>Grounding` field ({ state: GROUNDED | SPECULATION | NO_RECEIPT, ' +
|
|
165
|
+
'sourceUrl?, sourceRetrievedAt? }) — key on `state` there, and treat anything that is not ' +
|
|
166
|
+
'GROUNDED as unverified. ' +
|
|
90
167
|
'WHAT COUNTS AS A COMPETITOR: direct and adjacent products/services a target user would ' +
|
|
91
168
|
'realistically evaluate or already use to solve the same problem — including incumbents, ' +
|
|
92
169
|
'startups, and notable open-source or DIY alternatives; not tangential tools. Depth is a ' +
|
|
93
170
|
'focused landscape scan (roughly 3-10 competitors), not an exhaustive market map. ' +
|
|
171
|
+
'CHECK THE FREE READ FIRST: `list_competitors` returns the competitors a project has already ' +
|
|
172
|
+
'accumulated across every past run and the web app, at no credit cost. Read it (or ' +
|
|
173
|
+
'`get_project`) before spending here, so you do not pay to rediscover what the project ' +
|
|
174
|
+
'already knows. Use this tool when you need a FRESH scan or the project has no competitors yet. ' +
|
|
94
175
|
'ATTACH TO A PROJECT so results are saved to the web app\'s Research → Competitors tab: pass ' +
|
|
95
176
|
'`project_id` for an existing project, or `project_name` to auto-create one. Without either, ' +
|
|
96
177
|
'the scan still returns competitors here but does NOT persist them. ' +
|
|
@@ -115,6 +196,11 @@ export const TOOLS = [
|
|
|
115
196
|
'WHAT IT LOOKS FOR: evidence about the PROBLEM and demand — people describing the pain point, ' +
|
|
116
197
|
'asking for a solution, or complaining about existing tools — not generic keyword hits. This is ' +
|
|
117
198
|
'NOT a generic web search; frame the topic as a user problem/audience for the best threads. ' +
|
|
199
|
+
'CHECK THE FREE READ FIRST: `list_community_signals` returns the threads a project has ' +
|
|
200
|
+
'already accumulated across every past run and the web app, at no credit cost — including ' +
|
|
201
|
+
'each thread\'s cached verbatim `relevantQuotes[]`, the same field this tool returns. Read it ' +
|
|
202
|
+
'(or `get_project`) before spending here, so you do not pay to rediscover user voice the ' +
|
|
203
|
+
'project already holds. Use this tool when you need FRESH threads or the project has none yet. ' +
|
|
118
204
|
'ATTACH TO A PROJECT so results are saved to the web app\'s Research → Community tab: pass ' +
|
|
119
205
|
'`project_id` for an existing project, or `project_name` to auto-create one. Without either, the ' +
|
|
120
206
|
'threads are returned here but NOT persisted. ' +
|
|
@@ -132,11 +218,13 @@ export const TOOLS = [
|
|
|
132
218
|
defineTool({
|
|
133
219
|
name: 'list_projects',
|
|
134
220
|
description: 'List the caller\'s Clien.ai projects (newest first, paginated). Returns each ' +
|
|
135
|
-
'project\'s name and id as text
|
|
136
|
-
'
|
|
221
|
+
'project\'s name and id as readable text; the raw project array and pagination are ' +
|
|
222
|
+
'also returned as `structuredContent.projects` / `.pagination` (mirrored in `_meta`). ' +
|
|
223
|
+
'Use this to find an existing `project_id` to attach a `clien_research` ' +
|
|
137
224
|
'run to, or to check whether a project already exists before calling `create_project`. ' +
|
|
138
225
|
'Read-only: no credit cost, no side effects.',
|
|
139
226
|
zodSchema: ListProjectsInputSchema,
|
|
227
|
+
outputSchema: LIST_PROJECTS_OUTPUT_SCHEMA,
|
|
140
228
|
handler: (args, deps) => listProjects(args, deps),
|
|
141
229
|
}),
|
|
142
230
|
defineTool({
|
|
@@ -150,13 +238,49 @@ export const TOOLS = [
|
|
|
150
238
|
zodSchema: CreateProjectInputSchema,
|
|
151
239
|
handler: (args, deps) => createProject(args, deps),
|
|
152
240
|
}),
|
|
241
|
+
defineTool({
|
|
242
|
+
name: 'get_project',
|
|
243
|
+
description: 'Orient on a Clien.ai project in ONE call: the project\'s metadata plus the counts, ids, ' +
|
|
244
|
+
'and one-line summaries of everything in it — personas, interviews, competitors, ' +
|
|
245
|
+
'community signals, and research reports. START HERE when you pick up an existing ' +
|
|
246
|
+
'project and need to know what it already holds; it replaces the five separate ' +
|
|
247
|
+
'`list_*` calls that answer the same question. Reading it BEFORE `clien_research`, ' +
|
|
248
|
+
'`scan_competitors`, or `search_forums` is the cheapest way to avoid paying to ' +
|
|
249
|
+
'rediscover work the project already has. ' +
|
|
250
|
+
'Pass `include` (any of "personas", "interviews", "competitors", "community", ' +
|
|
251
|
+
'"reports") to inline those collections\' full records instead of summaries, and ' +
|
|
252
|
+
'`limit` to cap how many records per collection come back. Inlined interviews carry ' +
|
|
253
|
+
'`messageCount` but NOT transcripts — use `get_interview` for one. ' +
|
|
254
|
+
'DEGRADED RESULTS ARE NORMAL AND MUST BE READ CAREFULLY: each collection is fetched ' +
|
|
255
|
+
'independently, so one failing read does not lose the others — it comes back as ' +
|
|
256
|
+
'`{ error: "unavailable", detail }` under its key in `_meta.collections`. ' +
|
|
257
|
+
'`_meta.project` uses that SAME shape, so check for an `error` key there too ' +
|
|
258
|
+
'before reading `.name` — the project metadata can be the one part that failed ' +
|
|
259
|
+
'while every collection loaded. An `unavailable` entry is NOT an empty one: never ' +
|
|
260
|
+
'conclude a project has no competitors (and never start a paid scan) on the ' +
|
|
261
|
+
'strength of a collection that failed to load. A collection also comes back ' +
|
|
262
|
+
'`unavailable` when the server answers without a usable count, precisely so a ' +
|
|
263
|
+
'broken response can never read as "this project has none". Re-read just that ' +
|
|
264
|
+
'collection with its `list_*` tool. ' +
|
|
265
|
+
'COUNTS: `count` is the project-wide total and `countExact` is true for personas, ' +
|
|
266
|
+
'interviews, competitors, and community signals. For REPORTS the endpoint returns no ' +
|
|
267
|
+
'total, so a full page yields `countExact: false` and `count` is a LOWER BOUND — ' +
|
|
268
|
+
'there may be more. ' +
|
|
269
|
+
'ORDERING differs per collection and is not interchangeable: personas by newest ' +
|
|
270
|
+
'created, interviews by newest started, reports by newest created, competitors by ' +
|
|
271
|
+
'most recently SEEN (a competitor re-sighted by a later run moves back to the top), ' +
|
|
272
|
+
'and community signals by newest DISCOVERED (stable — a thread seen again does not ' +
|
|
273
|
+
'move). Read-only: no credit cost, no side effects.',
|
|
274
|
+
zodSchema: GetProjectInputSchema,
|
|
275
|
+
handler: (args, deps) => getProject(args, deps),
|
|
276
|
+
}),
|
|
153
277
|
defineTool({
|
|
154
278
|
name: 'create_persona',
|
|
155
279
|
description: 'Create a persona (a target user/customer profile) in a Clien.ai project from ' +
|
|
156
280
|
'fields you already know. Returns the created persona (including its `id`) in ' +
|
|
157
|
-
'`_meta.persona`. Requires a `
|
|
281
|
+
'`_meta.persona`. Requires a `project_id` — call `list_projects` first to find one, ' +
|
|
158
282
|
'or `create_project` to make one. Provide `name` and `role` at minimum; add ' +
|
|
159
|
-
'`company`, `description` (background/goals/pain points), `
|
|
283
|
+
'`company`, `description` (background/goals/pain points), `company_size`, `industry`, ' +
|
|
160
284
|
'and `location` when you have them. Set `ephemeral: true` for a scratch persona you ' +
|
|
161
285
|
'do NOT want counted in the project\'s aggregate insights (e.g. a quick one-off). ' +
|
|
162
286
|
'Compose with `interview_persona` to validate a NEW MARKET cheaply: create a persona ' +
|
|
@@ -166,82 +290,168 @@ export const TOOLS = [
|
|
|
166
290
|
'generate the background/company/industry from just a name + role, use `generate_persona` instead ' +
|
|
167
291
|
'(that path debits 1 credit).',
|
|
168
292
|
zodSchema: CreatePersonaInputSchema,
|
|
293
|
+
paramAliases: CREATE_PERSONA_ALIASES,
|
|
169
294
|
handler: (args, deps) => createPersona(args, deps),
|
|
170
295
|
}),
|
|
171
296
|
defineTool({
|
|
172
297
|
name: 'generate_persona',
|
|
173
298
|
description: 'AI-generate a persona from a short brief and save it to a Clien.ai project. Supply at minimum ' +
|
|
174
|
-
'`
|
|
299
|
+
'`project_id`, `name`, and `role`; the model fills a believable background, company, industry, ' +
|
|
175
300
|
'company size, and location, plus a decision endowment (what they use today, what they pay for ' +
|
|
176
301
|
'it, switching cost, and who pays vs. who uses) and a credibility domain (what the persona is ' +
|
|
177
302
|
'credible on, and not beyond) folded into the background so interviews reason from a real status ' +
|
|
178
|
-
'quo. Add `company`, `industry`, or `
|
|
179
|
-
'and `
|
|
303
|
+
'quo. Add `company`, `industry`, or `company_size` to pin those yourself, ' +
|
|
304
|
+
'and `additional_context` (a free-form brief) to steer the persona toward the product/market you ' +
|
|
180
305
|
'are validating. Set `ephemeral: true` for a scratch persona excluded from the project\'s ' +
|
|
181
|
-
'aggregate insights. Returns the
|
|
306
|
+
'aggregate insights. Returns the GENERATED PROFILE as readable text — name, role, company, ' +
|
|
307
|
+
'company size, industry, location, and the background paragraph the model wrote — so you can ' +
|
|
308
|
+
'read what you just paid for without a follow-up `get_persona`. The record is also in ' +
|
|
309
|
+
'`_meta.persona`. ' +
|
|
182
310
|
'This DEBITS 1 credit per generated persona (the explicit, no-AI `create_persona` is free — use ' +
|
|
183
311
|
'that when you already know the fields). On insufficient credits the tool returns a clear error ' +
|
|
184
312
|
'with your balance and a top-up link, and nothing is charged. A failed generation is never ' +
|
|
185
313
|
'charged, so a surfaced error is safe to retry.',
|
|
186
314
|
zodSchema: GeneratePersonaInputSchema,
|
|
315
|
+
paramAliases: GENERATE_PERSONA_ALIASES,
|
|
187
316
|
handler: (args, deps) => generatePersona(args, deps),
|
|
188
317
|
}),
|
|
189
318
|
defineTool({
|
|
190
319
|
name: 'enrich_persona',
|
|
191
320
|
description: 'AI-enrich an EXISTING persona: fill in the thin scalar fields it is missing (background/' +
|
|
192
|
-
'description, company, industry, company size, location) using the model. Supply `
|
|
321
|
+
'description, company, industry, company size, location) using the model. Supply `persona_id`; ' +
|
|
193
322
|
'the model fills only the fields that are currently BLANK — it never overwrites content you ' +
|
|
194
323
|
'already entered. To regenerate specific already-populated fields, pass `refresh` (e.g. ' +
|
|
195
|
-
'["description", "industry"]). Add `
|
|
196
|
-
'enrichment toward the product/market you are validating. Returns the
|
|
197
|
-
'
|
|
324
|
+
'["description", "industry"]). Add `additional_context` (a free-form brief) to steer the ' +
|
|
325
|
+
'enrichment toward the product/market you are validating. Returns the UPDATED PROFILE as ' +
|
|
326
|
+
'readable text (so you can read the fields the model just filled) plus the list of filled ' +
|
|
327
|
+
'field names; both are also in `_meta.persona` / `_meta.enriched`. ' +
|
|
198
328
|
'This DEBITS 1 credit per enrichment (use `create_persona` to set fields explicitly for free, ' +
|
|
199
329
|
'or `generate_persona` to AI-create a brand-new persona). If nothing is blank and you pass no ' +
|
|
200
330
|
'`refresh`, it is a no-op and NOTHING is charged. On insufficient credits the tool returns a ' +
|
|
201
331
|
'clear error with your balance and a top-up link. A failed enrichment is always refunded, so a ' +
|
|
202
332
|
'surfaced error is safe to retry. Provenance (source, insights inclusion) is left unchanged.',
|
|
203
333
|
zodSchema: EnrichPersonaInputSchema,
|
|
334
|
+
paramAliases: ENRICH_PERSONA_ALIASES,
|
|
204
335
|
handler: (args, deps) => enrichPersona(args, deps),
|
|
205
336
|
}),
|
|
337
|
+
defineTool({
|
|
338
|
+
name: 'list_personas',
|
|
339
|
+
description: 'List the personas in a Clien.ai project (newest first, paginated). Returns each ' +
|
|
340
|
+
'persona\'s name, role, and id as readable text; the raw persona array and pagination are ' +
|
|
341
|
+
'also returned as `structuredContent.personas` / `.pagination` (mirrored in `_meta`). ' +
|
|
342
|
+
'This list is deliberately one line per persona — call `get_persona` for a full profile. ' +
|
|
343
|
+
'Requires a `project_id` — call `list_projects` ' +
|
|
344
|
+
'to find one. This is the KEYSTONE discovery read: it surfaces personas created in the ' +
|
|
345
|
+
'web app too, so you can get a persona `id` to pass to `get_persona`, `update_persona`, ' +
|
|
346
|
+
'`enrich_persona`, or `interview_persona` — previously an agent could only reach personas ' +
|
|
347
|
+
'it created in the same session. Each entry carries read-only `seniority` / `careerPath` ' +
|
|
348
|
+
'when the persona has identity grounding; forum sources and `identityProvenance` live in ' +
|
|
349
|
+
'`report_data` (read them via `get_report`). ' +
|
|
350
|
+
'Read-only: no credit cost, no side effects.',
|
|
351
|
+
zodSchema: ListPersonasInputSchema,
|
|
352
|
+
outputSchema: LIST_PERSONAS_OUTPUT_SCHEMA,
|
|
353
|
+
handler: (args, deps) => listPersonas(args, deps),
|
|
354
|
+
}),
|
|
355
|
+
defineTool({
|
|
356
|
+
name: 'get_persona',
|
|
357
|
+
description: 'Fetch a single persona by its `persona_id` (from a `list_personas` entry, or the id printed ' +
|
|
358
|
+
'by `create_persona` / `generate_persona`). Returns the FULL persona profile as readable ' +
|
|
359
|
+
'text — name, role, company, company size, industry, location, the background/description ' +
|
|
360
|
+
'paragraph, provenance (`source`), lock state, and the read-only identity priors ' +
|
|
361
|
+
'(`seniority` / `careerPath`) when the persona has them — so you can read the persona you ' +
|
|
362
|
+
'are about to interview or correct without any further call. The same record is also ' +
|
|
363
|
+
'returned as `structuredContent.persona` (and mirrored in `_meta.persona`) for programmatic ' +
|
|
364
|
+
'use. Use it to inspect a persona before correcting it with `update_persona` or ' +
|
|
365
|
+
'interviewing it with `interview_persona`. TRUST: this is the persona ENTITY. The identity ' +
|
|
366
|
+
'priors are the ONE piece of grounding it carries (FLAT fields here; `get_report` nests the ' +
|
|
367
|
+
'same two names under `report_data.personas[].identityPriors`), and they are ' +
|
|
368
|
+
'aggregate-calibrated, never span-receipted — so they are not evidence you can follow to a ' +
|
|
369
|
+
'source. Forum receipts (`sources[]`) and `identityProvenance` remain `report_data` only, ' +
|
|
370
|
+
'read them with `get_report`. Treat every other field here as unverified profile data until ' +
|
|
371
|
+
'you have checked it there. Read-only: no credit cost, no side effects.',
|
|
372
|
+
zodSchema: GetPersonaInputSchema,
|
|
373
|
+
outputSchema: GET_PERSONA_OUTPUT_SCHEMA,
|
|
374
|
+
handler: (args, deps) => getPersona(args, deps),
|
|
375
|
+
}),
|
|
376
|
+
defineTool({
|
|
377
|
+
name: 'update_persona',
|
|
378
|
+
description: 'Correct explicit scalar fields of an EXISTING persona (fix a wrong role, company, ' +
|
|
379
|
+
'industry, background, etc.). Supply `persona_id` and at least one of `name`, `role`, ' +
|
|
380
|
+
'`company`, `description`, `company_size`, `industry`, `location`; only the fields you pass ' +
|
|
381
|
+
'are changed. Returns the updated persona in `_meta.persona` and the changed fields in ' +
|
|
382
|
+
'`_meta.updated` — named as they appear on the persona ENTITY (so `company_size` reports ' +
|
|
383
|
+
'back as `companySize`, matching `_meta.persona`). This is a FREE, unmetered explicit edit ' +
|
|
384
|
+
'— it does NOT use the AI or ' +
|
|
385
|
+
'debit a credit (use `enrich_persona` to AI-fill blank fields instead, or `generate_persona` ' +
|
|
386
|
+
'to AI-create a new one). Completes the read → correct → interview loop from the agent: ' +
|
|
387
|
+
'discover a persona with `list_personas`, fix it here, then `interview_persona`. Rejected ' +
|
|
388
|
+
'with a 404 if you do not own the persona (call `list_personas` to confirm the id); a persona ' +
|
|
389
|
+
'locked by subscription limits is refused separately with an upgrade prompt. ' +
|
|
390
|
+
'Identity priors (seniority / career path) are not editable here.',
|
|
391
|
+
zodSchema: UpdatePersonaInputSchema,
|
|
392
|
+
paramAliases: UPDATE_PERSONA_ALIASES,
|
|
393
|
+
handler: (args, deps) => updatePersona(args, deps),
|
|
394
|
+
}),
|
|
206
395
|
defineTool({
|
|
207
396
|
name: 'list_reports',
|
|
208
397
|
description: 'List the caller\'s past `clien_research` runs (newest first, paginated by `limit`). ' +
|
|
209
|
-
'Returns each report\'s prompt, status, and `job_id` as text
|
|
210
|
-
'`
|
|
398
|
+
'Returns each report\'s prompt, status, and `job_id` as readable text; the raw job array is ' +
|
|
399
|
+
'also returned as `structuredContent.jobs` (mirrored in `_meta.jobs`). ' +
|
|
400
|
+
'Optionally scope to one project with `project_id`. Use this to find a ' +
|
|
211
401
|
'past report to retrieve with `get_report` instead of re-running `clien_research` — ' +
|
|
212
402
|
're-running spawns a new job and debits credits again for the same idea. Pair with ' +
|
|
213
403
|
'`get_report` for a free competitor spot-check (read `report_data.competitors[]` from a ' +
|
|
214
404
|
'recent run; see docs/recipes/competitor-spot-check.md). ' +
|
|
215
405
|
'Read-only: no credit cost, no side effects.',
|
|
216
406
|
zodSchema: ListReportsInputSchema,
|
|
407
|
+
outputSchema: LIST_REPORTS_OUTPUT_SCHEMA,
|
|
217
408
|
handler: (args, deps) => listReports(args, deps),
|
|
218
409
|
}),
|
|
219
410
|
defineTool({
|
|
220
411
|
name: 'get_report',
|
|
221
412
|
description: 'Retrieve the full report for a past `clien_research` job by its `job_id` (from a prior ' +
|
|
222
|
-
'run\'s `_meta.job_id
|
|
223
|
-
'
|
|
224
|
-
'
|
|
225
|
-
'GROUNDED / SPECULATION / NO_RECEIPT
|
|
226
|
-
'"RCP-p{i}-s{j}"
|
|
227
|
-
'
|
|
228
|
-
'`
|
|
413
|
+
'run\'s `_meta.job_id`, the job id printed when the run started, or a `list_reports` entry). ' +
|
|
414
|
+
'Returns the markdown report as text, FOLLOWED BY A MACHINE-CHECKED TRUST DIGEST rendered ' +
|
|
415
|
+
'into that same text — read the digest rather than trusting the prose. The digest carries: ' +
|
|
416
|
+
'(1) the persona claim spine — every claim\'s GROUNDED / SPECULATION / NO_RECEIPT state with ' +
|
|
417
|
+
'its "RCP-p{i}-s{j}" receipt id, which resolves in the receipt pool printed below it; ' +
|
|
418
|
+
'NO_RECEIPT can mean a bad claim OR merely sparse evidence, so check that persona\'s ' +
|
|
419
|
+
'`insufficientEvidence` / `sourcesFound` line before discounting it. ' +
|
|
420
|
+
'(2) the SEPARATE market/competitor spine — same three states, "RRCP-s{n}" receipt ids into ' +
|
|
421
|
+
'their own evidence pool; a NO_RECEIPT claim marked "model-attested" means a supporting page ' +
|
|
422
|
+
'was read and independently vouched but no exact span pinned (NOT a receipt), and an unmarked ' +
|
|
423
|
+
'NO_RECEIPT is recalled model knowledge, unverified. Neither counts as grounded — key on the ' +
|
|
424
|
+
'state, never on whether a source id is present. ' +
|
|
425
|
+
'(3) per-persona QA — a ⚠️ QA-FLAGGED persona failed a quality check (or could not be checked ' +
|
|
426
|
+
'at all); do not rely on its claims. Its `identityPriors` (seniority rung, career path) are ' +
|
|
427
|
+
'typed enrichment and `identityProvenance` is a PII-free aggregate calibration line — NEVER a ' +
|
|
428
|
+
'receipt, do not cite it as a source. ' +
|
|
429
|
+
'(4) the anti-sycophancy readout — explicit rejection count, `lowDiscrimination` broken-persona ' +
|
|
430
|
+
'flags, and per-hypothesis disagreement splits. ' +
|
|
431
|
+
'(5) hypothesis robustness — when a verdict FLIPPED under rephrasing the digest names the ' +
|
|
432
|
+
'downgraded verdict to act on instead of the reported one. ' +
|
|
433
|
+
'When a section is missing the digest SAYS SO ("NOT PRESENT on this run") — absent is not ' +
|
|
434
|
+
'clean, so treat the corresponding prose as unverified. The full structured `report_data` ' +
|
|
435
|
+
'(hypotheses, competitors[], key findings, and every field summarised above) is also returned ' +
|
|
436
|
+
'as `structuredContent.report_data`, mirrored in `_meta.report_data`. ' +
|
|
437
|
+
'Use this to RETRIEVE past research instead of ' +
|
|
229
438
|
're-running `clien_research`, which would debit credits again for the same idea. ' +
|
|
230
439
|
'Backs the competitor spot-check (read `report_data.competitors[]`) and pivot-viability ' +
|
|
231
440
|
'(compare a pivot\'s report against the original) recipes in docs/recipes/. ' +
|
|
232
441
|
'If the job is still running or you are unsure of its state, use `clien_research_status`. ' +
|
|
233
442
|
'Read-only: no credit cost, no side effects.',
|
|
234
443
|
zodSchema: GetReportInputSchema,
|
|
444
|
+
outputSchema: GET_REPORT_OUTPUT_SCHEMA,
|
|
235
445
|
handler: (args, deps) => getReport(args, deps),
|
|
236
446
|
}),
|
|
237
447
|
defineTool({
|
|
238
448
|
name: 'interview_persona',
|
|
239
449
|
description: 'Run a real, stateful multi-turn interview with a persona and get its full replies. ' +
|
|
240
|
-
'Drive it as a loop: `action:start` once (with
|
|
450
|
+
'Drive it as a loop: `action:start` once (with project_id + persona_id) opens the interview ' +
|
|
241
451
|
'and seeds the persona\'s greeting, returning the interview id in `_meta.interview.id`. ' +
|
|
242
|
-
'Then `action:turn` (
|
|
452
|
+
'Then `action:turn` (interview_id + content) repeatedly — each call posts one question and ' +
|
|
243
453
|
'returns THAT persona\'s full reply as the result text; read it, then ask the next question. ' +
|
|
244
|
-
'`action:transcript` (
|
|
454
|
+
'`action:transcript` (interview_id) re-reads the whole conversation. `action:complete` closes ' +
|
|
245
455
|
'the interview when you\'ve learned enough (5-12 turns is typical); `action:reopen` resumes a ' +
|
|
246
456
|
'completed one. Interviews and their auto-summary/message-count behave exactly like the web app. ' +
|
|
247
457
|
'Set `ephemeral:true` on `start` for a scratch interview excluded from the project\'s aggregate ' +
|
|
@@ -250,7 +460,87 @@ export const TOOLS = [
|
|
|
250
460
|
'interviews together yourself. Each `turn` generates a real AI reply (metered by your monthly ' +
|
|
251
461
|
'usage; per-turn credit pricing is not yet applied).',
|
|
252
462
|
zodSchema: InterviewPersonaInputSchema,
|
|
463
|
+
paramAliases: INTERVIEW_PERSONA_ALIASES,
|
|
253
464
|
handler: (args, deps) => interviewPersona(args, deps),
|
|
254
465
|
}),
|
|
466
|
+
defineTool({
|
|
467
|
+
name: 'list_interviews',
|
|
468
|
+
description: 'List the interviews in a Clien.ai project (newest first, paginated). Returns each ' +
|
|
469
|
+
'interview\'s status, persona id, message count, and id as readable text; the raw interview ' +
|
|
470
|
+
'array and pagination are also returned as `structuredContent.interviews` / `.pagination` ' +
|
|
471
|
+
'(mirrored in `_meta`). Entries carry ' +
|
|
472
|
+
'`messageCount`, NOT their message transcripts — a page of full transcripts is a lot of ' +
|
|
473
|
+
'context for a "which interviews exist?" question; read one with `get_interview`. ' +
|
|
474
|
+
'Requires a `project_id` — call `list_projects` to find one. Use it to ' +
|
|
475
|
+
'RECOVER a past interview id (including interviews started in the web app) so you can ' +
|
|
476
|
+
're-read its transcript with `get_interview` — previously an interview id was only ' +
|
|
477
|
+
'obtainable from `interview_persona action:start` in the same session. Read-only: no ' +
|
|
478
|
+
'credit cost, no side effects.',
|
|
479
|
+
zodSchema: ListInterviewsInputSchema,
|
|
480
|
+
outputSchema: LIST_INTERVIEWS_OUTPUT_SCHEMA,
|
|
481
|
+
handler: (args, deps) => listInterviews(args, deps),
|
|
482
|
+
}),
|
|
483
|
+
defineTool({
|
|
484
|
+
name: 'get_interview',
|
|
485
|
+
description: 'Fetch a single interview by its `interview_id` (from a `list_interviews` entry or an ' +
|
|
486
|
+
'interview\'s id printed by `interview_persona action:start`). Returns the full message ' +
|
|
487
|
+
'transcript as readable text; the interview entity (status, personaId, messages, ' +
|
|
488
|
+
'completedAt) is also returned as `structuredContent.interview` (mirrored in ' +
|
|
489
|
+
'`_meta.interview`). Use it ' +
|
|
490
|
+
'to re-read a completed interview without re-running it. This is the read-only twin of ' +
|
|
491
|
+
'`interview_persona action:transcript`, reachable from just an id. Read-only: no credit ' +
|
|
492
|
+
'cost, no side effects.',
|
|
493
|
+
zodSchema: GetInterviewInputSchema,
|
|
494
|
+
outputSchema: GET_INTERVIEW_OUTPUT_SCHEMA,
|
|
495
|
+
handler: (args, deps) => getInterview(args, deps),
|
|
496
|
+
}),
|
|
497
|
+
defineTool({
|
|
498
|
+
name: 'list_competitors',
|
|
499
|
+
description: 'List the competitors recorded for a Clien.ai project (most-recently-seen first, ' +
|
|
500
|
+
'paginated). Returns each competitor\'s name, pricing, description, url, and company ' +
|
|
501
|
+
'facts as readable text; the full competitor array and pagination are also returned as ' +
|
|
502
|
+
'`structuredContent.competitors` / `.pagination` (mirrored in `_meta`). ' +
|
|
503
|
+
'Requires a `project_id` — call `list_projects` to find one. ' +
|
|
504
|
+
'This reads the project\'s DEDUPED, ACCUMULATED competitor set — merged across every ' +
|
|
505
|
+
'research run and the web app — so unlike `get_report` (one run\'s view) or ' +
|
|
506
|
+
'`scan_competitors` (a fresh, credit-debiting scan), it answers "what does this project ' +
|
|
507
|
+
'already know?" without spending anything. Check here BEFORE running `scan_competitors` ' +
|
|
508
|
+
'to avoid paying to rediscover competitors you already have. ' +
|
|
509
|
+
'TRUST: each of the four company facts (`funding`, `employeeCount`, `founded`, ' +
|
|
510
|
+
'`hqLocation`) carries its own grounding in the sibling `<fact>Grounding` field ' +
|
|
511
|
+
'({ state: GROUNDED | SPECULATION | NO_RECEIPT, sourceUrl?, sourceRetrievedAt? }), ' +
|
|
512
|
+
'persisted in lockstep with the value so it always describes the figure shown. ' +
|
|
513
|
+
'A `null` grounding means no source was attributed — key on `state` and treat anything ' +
|
|
514
|
+
'that is not GROUNDED as unverified; the presence of a grounding object never by itself ' +
|
|
515
|
+
'means the fact is checked. ' +
|
|
516
|
+
'Read-only: no credit cost, no side effects.',
|
|
517
|
+
zodSchema: ListCompetitorsInputSchema,
|
|
518
|
+
outputSchema: LIST_COMPETITORS_OUTPUT_SCHEMA,
|
|
519
|
+
handler: (args, deps) => listCompetitors(args, deps),
|
|
520
|
+
}),
|
|
521
|
+
defineTool({
|
|
522
|
+
name: 'list_community_signals',
|
|
523
|
+
description: 'List the community signals (forum/Reddit/HN threads) recorded for a Clien.ai project ' +
|
|
524
|
+
'(newest-discovered first, paginated). Returns each thread\'s title, platform, ' +
|
|
525
|
+
'sentiment summary, url, a representative quote, and engagement as readable text; the full ' +
|
|
526
|
+
'signal array and pagination are also returned as `structuredContent.communitySignals` / ' +
|
|
527
|
+
'`.pagination` (mirrored in `_meta`). Requires ' +
|
|
528
|
+
'a `project_id` — call `list_projects` to find one. ' +
|
|
529
|
+
'This reads the project\'s DEDUPED, ACCUMULATED thread set — merged across every research ' +
|
|
530
|
+
'run and the web app — so unlike `get_report` (one run\'s view) or `search_forums` (a ' +
|
|
531
|
+
'fresh, credit-debiting scan), it answers "what user voice has this project already ' +
|
|
532
|
+
'collected?" for free. Check here BEFORE running `search_forums` to avoid paying to ' +
|
|
533
|
+
'rediscover threads you already have. Each signal\'s `relevantQuotes[]` are the verbatim ' +
|
|
534
|
+
'user-voice excerpts cached at collection — the same field `search_forums` returns — so ' +
|
|
535
|
+
'they stay readable even if the thread later disappears. ' +
|
|
536
|
+
'ORDERING differs from `list_competitors` on purpose: this feed is ordered by when the ' +
|
|
537
|
+
'project FIRST saw a thread and that order is STABLE — a thread a later run sees again ' +
|
|
538
|
+
'does not move back to page one. So page one is the newest DISCOVERIES, not the newest ' +
|
|
539
|
+
'activity; do not read a thread\'s position as a recency signal. ' +
|
|
540
|
+
'Read-only: no credit cost, no side effects.',
|
|
541
|
+
zodSchema: ListCommunitySignalsInputSchema,
|
|
542
|
+
outputSchema: LIST_COMMUNITY_SIGNALS_OUTPUT_SCHEMA,
|
|
543
|
+
handler: (args, deps) => listCommunitySignals(args, deps),
|
|
544
|
+
}),
|
|
255
545
|
];
|
|
256
546
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|