@withpica/mcp-server 2.51.0 → 2.52.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/.claude/settings.local.json +5 -0
- package/CHANGELOG.md +0 -41
- package/dist/prompts/index.d.ts +0 -32
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +0 -235
- package/dist/prompts/index.js.map +1 -1
- package/dist/resources/index.d.ts +0 -10
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +1 -134
- package/dist/resources/index.js.map +1 -1
- package/dist/server-instructions.d.ts +3 -4
- package/dist/server-instructions.d.ts.map +1 -1
- package/dist/server-instructions.js +1 -4
- package/dist/server-instructions.js.map +1 -1
- package/dist/server.d.ts +0 -26
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +10 -108
- package/dist/server.js.map +1 -1
- package/dist/tools/agent-identity.d.ts.map +1 -1
- package/dist/tools/agent-identity.js +0 -15
- package/dist/tools/agent-identity.js.map +1 -1
- package/dist/tools/agreement-types.d.ts.map +1 -1
- package/dist/tools/agreement-types.js +0 -24
- package/dist/tools/agreement-types.js.map +1 -1
- package/dist/tools/agreements.d.ts.map +1 -1
- package/dist/tools/agreements.js +3 -21
- package/dist/tools/agreements.js.map +1 -1
- package/dist/tools/analytics.d.ts.map +1 -1
- package/dist/tools/analytics.js +1 -19
- package/dist/tools/analytics.js.map +1 -1
- package/dist/tools/app-tools.d.ts.map +1 -1
- package/dist/tools/app-tools.js +2 -11
- package/dist/tools/app-tools.js.map +1 -1
- package/dist/tools/assets.d.ts.map +1 -1
- package/dist/tools/assets.js +0 -33
- package/dist/tools/assets.js.map +1 -1
- package/dist/tools/audio-files.d.ts +0 -5
- package/dist/tools/audio-files.d.ts.map +1 -1
- package/dist/tools/audio-files.js +0 -91
- package/dist/tools/audio-files.js.map +1 -1
- package/dist/tools/audit.d.ts.map +1 -1
- package/dist/tools/audit.js +2 -11
- package/dist/tools/audit.js.map +1 -1
- package/dist/tools/auth.d.ts.map +1 -1
- package/dist/tools/auth.js +0 -6
- package/dist/tools/auth.js.map +1 -1
- package/dist/tools/bulk.d.ts.map +1 -1
- package/dist/tools/bulk.js +0 -6
- package/dist/tools/bulk.js.map +1 -1
- package/dist/tools/calendar.d.ts.map +1 -1
- package/dist/tools/calendar.js +0 -3
- package/dist/tools/calendar.js.map +1 -1
- package/dist/tools/collaborators.d.ts.map +1 -1
- package/dist/tools/collaborators.js +3 -24
- package/dist/tools/collaborators.js.map +1 -1
- package/dist/tools/comparisons.d.ts.map +1 -1
- package/dist/tools/comparisons.js +0 -6
- package/dist/tools/comparisons.js.map +1 -1
- package/dist/tools/credits.d.ts +0 -18
- package/dist/tools/credits.d.ts.map +1 -1
- package/dist/tools/credits.js +4 -344
- package/dist/tools/credits.js.map +1 -1
- package/dist/tools/custody.d.ts.map +1 -1
- package/dist/tools/custody.js +2 -23
- package/dist/tools/custody.js.map +1 -1
- package/dist/tools/dashboard.d.ts.map +1 -1
- package/dist/tools/dashboard.js +7 -43
- package/dist/tools/dashboard.js.map +1 -1
- package/dist/tools/directory.d.ts.map +1 -1
- package/dist/tools/directory.js +0 -3
- package/dist/tools/directory.js.map +1 -1
- package/dist/tools/discovery.d.ts.map +1 -1
- package/dist/tools/discovery.js +7 -94
- package/dist/tools/discovery.js.map +1 -1
- package/dist/tools/disputes.d.ts.map +1 -1
- package/dist/tools/disputes.js +1 -4
- package/dist/tools/disputes.js.map +1 -1
- package/dist/tools/documents.d.ts.map +1 -1
- package/dist/tools/documents.js +0 -3
- package/dist/tools/documents.js.map +1 -1
- package/dist/tools/duplicates.d.ts.map +1 -1
- package/dist/tools/duplicates.js +0 -6
- package/dist/tools/duplicates.js.map +1 -1
- package/dist/tools/enrichment.d.ts.map +1 -1
- package/dist/tools/enrichment.js +0 -33
- package/dist/tools/enrichment.js.map +1 -1
- package/dist/tools/exports.d.ts.map +1 -1
- package/dist/tools/exports.js +3 -18
- package/dist/tools/exports.js.map +1 -1
- package/dist/tools/feedback.d.ts.map +1 -1
- package/dist/tools/feedback.js +0 -3
- package/dist/tools/feedback.js.map +1 -1
- package/dist/tools/files.d.ts +30 -0
- package/dist/tools/files.d.ts.map +1 -0
- package/dist/tools/files.js +98 -0
- package/dist/tools/files.js.map +1 -0
- package/dist/tools/groups.d.ts.map +1 -1
- package/dist/tools/groups.js +0 -12
- package/dist/tools/groups.js.map +1 -1
- package/dist/tools/import-documents.d.ts.map +1 -1
- package/dist/tools/import-documents.js +1 -10
- package/dist/tools/import-documents.js.map +1 -1
- package/dist/tools/import.d.ts.map +1 -1
- package/dist/tools/import.js +3 -36
- package/dist/tools/import.js.map +1 -1
- package/dist/tools/index.d.ts +6 -142
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +115 -269
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/integrations.d.ts.map +1 -1
- package/dist/tools/integrations.js +8 -28
- package/dist/tools/integrations.js.map +1 -1
- package/dist/tools/labels.d.ts.map +1 -1
- package/dist/tools/labels.js +0 -3
- package/dist/tools/labels.js.map +1 -1
- package/dist/tools/licensing.d.ts.map +1 -1
- package/dist/tools/licensing.js +0 -15
- package/dist/tools/licensing.js.map +1 -1
- package/dist/tools/memory.d.ts.map +1 -1
- package/dist/tools/memory.js +3 -15
- package/dist/tools/memory.js.map +1 -1
- package/dist/tools/metadata.d.ts.map +1 -1
- package/dist/tools/metadata.js +15 -77
- package/dist/tools/metadata.js.map +1 -1
- package/dist/tools/multimedia.d.ts.map +1 -1
- package/dist/tools/multimedia.js +0 -15
- package/dist/tools/multimedia.js.map +1 -1
- package/dist/tools/my-reported-issues.d.ts.map +1 -1
- package/dist/tools/my-reported-issues.js +0 -3
- package/dist/tools/my-reported-issues.js.map +1 -1
- package/dist/tools/notes.d.ts.map +1 -1
- package/dist/tools/notes.js +0 -12
- package/dist/tools/notes.js.map +1 -1
- package/dist/tools/notifications.d.ts.map +1 -1
- package/dist/tools/notifications.js +1 -25
- package/dist/tools/notifications.js.map +1 -1
- package/dist/tools/onboarding.d.ts.map +1 -1
- package/dist/tools/onboarding.js +0 -3
- package/dist/tools/onboarding.js.map +1 -1
- package/dist/tools/people.d.ts.map +1 -1
- package/dist/tools/people.js +1 -16
- package/dist/tools/people.js.map +1 -1
- package/dist/tools/projects.d.ts.map +1 -1
- package/dist/tools/projects.js +0 -18
- package/dist/tools/projects.js.map +1 -1
- package/dist/tools/publishers.d.ts.map +1 -1
- package/dist/tools/publishers.js +0 -6
- package/dist/tools/publishers.js.map +1 -1
- package/dist/tools/recordings.d.ts.map +1 -1
- package/dist/tools/recordings.js +0 -15
- package/dist/tools/recordings.js.map +1 -1
- package/dist/tools/recovery-hints.d.ts.map +1 -1
- package/dist/tools/recovery-hints.js +2 -28
- package/dist/tools/recovery-hints.js.map +1 -1
- package/dist/tools/release-rich.d.ts.map +1 -1
- package/dist/tools/release-rich.js +2 -4
- package/dist/tools/release-rich.js.map +1 -1
- package/dist/tools/releases.d.ts.map +1 -1
- package/dist/tools/releases.js +0 -55
- package/dist/tools/releases.js.map +1 -1
- package/dist/tools/report-issue.d.ts.map +1 -1
- package/dist/tools/report-issue.js +0 -3
- package/dist/tools/report-issue.js.map +1 -1
- package/dist/tools/royalties.d.ts.map +1 -1
- package/dist/tools/royalties.js +3 -18
- package/dist/tools/royalties.js.map +1 -1
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +1 -10
- package/dist/tools/search.js.map +1 -1
- package/dist/tools/send.d.ts.map +1 -1
- package/dist/tools/send.js +0 -9
- package/dist/tools/send.js.map +1 -1
- package/dist/tools/sessions.d.ts.map +1 -1
- package/dist/tools/sessions.js +0 -12
- package/dist/tools/sessions.js.map +1 -1
- package/dist/tools/settings.d.ts.map +1 -1
- package/dist/tools/settings.js +3 -30
- package/dist/tools/settings.js.map +1 -1
- package/dist/tools/share-links.d.ts.map +1 -1
- package/dist/tools/share-links.js +0 -15
- package/dist/tools/share-links.js.map +1 -1
- package/dist/tools/signup.d.ts.map +1 -1
- package/dist/tools/signup.js +0 -3
- package/dist/tools/signup.js.map +1 -1
- package/dist/tools/split-sheets.d.ts.map +1 -1
- package/dist/tools/split-sheets.js +1 -22
- package/dist/tools/split-sheets.js.map +1 -1
- package/dist/tools/storage-config.d.ts.map +1 -1
- package/dist/tools/storage-config.js +0 -6
- package/dist/tools/storage-config.js.map +1 -1
- package/dist/tools/subscription.d.ts.map +1 -1
- package/dist/tools/subscription.js +10 -9
- package/dist/tools/subscription.js.map +1 -1
- package/dist/tools/sync-placements.d.ts.map +1 -1
- package/dist/tools/sync-placements.js +2 -20
- package/dist/tools/sync-placements.js.map +1 -1
- package/dist/tools/team.d.ts.map +1 -1
- package/dist/tools/team.js +0 -15
- package/dist/tools/team.js.map +1 -1
- package/dist/tools/telegram.d.ts.map +1 -1
- package/dist/tools/telegram.js +0 -9
- package/dist/tools/telegram.js.map +1 -1
- package/dist/tools/uploads.d.ts.map +1 -1
- package/dist/tools/uploads.js +0 -6
- package/dist/tools/uploads.js.map +1 -1
- package/dist/tools/works.d.ts.map +1 -1
- package/dist/tools/works.js +3 -37
- package/dist/tools/works.js.map +1 -1
- package/package.json +6 -7
- package/server.json +2 -2
- package/dist/prompts/creator-question-atlas.d.ts +0 -48
- package/dist/prompts/creator-question-atlas.d.ts.map +0 -1
- package/dist/prompts/creator-question-atlas.js +0 -618
- package/dist/prompts/creator-question-atlas.js.map +0 -1
- package/dist/skills/index.d.ts +0 -42
- package/dist/skills/index.d.ts.map +0 -1
- package/dist/skills/index.js +0 -59
- package/dist/skills/index.js.map +0 -1
- package/dist/skills/skills.generated.d.ts +0 -25
- package/dist/skills/skills.generated.d.ts.map +0 -1
- package/dist/skills/skills.generated.js +0 -86
- package/dist/skills/skills.generated.js.map +0 -1
- package/dist/tools/access-simulate.d.ts +0 -23
- package/dist/tools/access-simulate.d.ts.map +0 -1
- package/dist/tools/access-simulate.js +0 -165
- package/dist/tools/access-simulate.js.map +0 -1
- package/dist/tools/explainability.d.ts +0 -24
- package/dist/tools/explainability.d.ts.map +0 -1
- package/dist/tools/explainability.js +0 -137
- package/dist/tools/explainability.js.map +0 -1
- package/dist/tools/my-recent-questions.d.ts +0 -25
- package/dist/tools/my-recent-questions.d.ts.map +0 -1
- package/dist/tools/my-recent-questions.js +0 -186
- package/dist/tools/my-recent-questions.js.map +0 -1
- package/dist/tools/share-send.d.ts +0 -28
- package/dist/tools/share-send.d.ts.map +0 -1
- package/dist/tools/share-send.js +0 -131
- package/dist/tools/share-send.js.map +0 -1
- package/dist/tools/sharing.d.ts +0 -29
- package/dist/tools/sharing.d.ts.map +0 -1
- package/dist/tools/sharing.js +0 -131
- package/dist/tools/sharing.js.map +0 -1
- package/dist/tools/skills.d.ts +0 -25
- package/dist/tools/skills.d.ts.map +0 -1
- package/dist/tools/skills.js +0 -144
- package/dist/tools/skills.js.map +0 -1
- package/scripts/build-skills.ts +0 -229
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
-
import { formatSuccess } from "@withpica/mcp-utils";
|
|
3
|
-
// Mirror of COUNT_SOURCES in lib/services/count-explain.ts. The lint
|
|
4
|
-
// check at scripts/lint-mcp-tools.ts asserts this stays in sync with
|
|
5
|
-
// the service-layer registry. Adding a value here without a registry
|
|
6
|
-
// entry trips the lint at build time.
|
|
7
|
-
const COUNT_SOURCES = [
|
|
8
|
-
"dashboard.registered_pro",
|
|
9
|
-
"dashboard.registered_nro",
|
|
10
|
-
"briefing.audio_pending",
|
|
11
|
-
"briefing.unconnected_collaborators",
|
|
12
|
-
"briefing.unverified_writers",
|
|
13
|
-
"briefing.works_without_credits",
|
|
14
|
-
];
|
|
15
|
-
export class ExplainabilityTools {
|
|
16
|
-
pica;
|
|
17
|
-
constructor(pica) {
|
|
18
|
-
this.pica = pica;
|
|
19
|
-
}
|
|
20
|
-
getTools() {
|
|
21
|
-
return [
|
|
22
|
-
{
|
|
23
|
-
definition: {
|
|
24
|
-
name: "pica_count_explain",
|
|
25
|
-
tier: "read",
|
|
26
|
-
description: "Use when the user asks: 'why does the dashboard say 80 but I counted 78?', 'where are the missing works?', 'explain this number'. " +
|
|
27
|
-
"Generic explainer for dashboard / briefing count discrepancies. " +
|
|
28
|
-
"Closed enum of 6 count sources (additive). Returns the canonical query, the computed value, and (when observed_value supplied) a delta_breakdown that sums to the absolute delta. " +
|
|
29
|
-
"→ then: pica_works_query (drill into the specific rows), pica_dashboard_briefing (re-read the briefing now that you understand the count)",
|
|
30
|
-
workflows: "infrastructure",
|
|
31
|
-
vernacular_kind: "creator-entry",
|
|
32
|
-
inputSchema: {
|
|
33
|
-
type: "object",
|
|
34
|
-
properties: {
|
|
35
|
-
count_source: {
|
|
36
|
-
type: "string",
|
|
37
|
-
enum: [...COUNT_SOURCES],
|
|
38
|
-
description: "Which count to explain. dashboard.registered_pro: works registered with any PRO (PRS, ASCAP, BMI, SACEM, GEMA, JASRAC, etc.). dashboard.registered_nro: works registered with any NRO (PPL, SoundExchange, GVL, etc.). briefing.audio_pending: audio_files where analysis_status='pending'. briefing.unconnected_collaborators: distinct credited people without a linked PICA user. briefing.unverified_writers: writer credits where attestation_status != 'attested'. briefing.works_without_credits: works with zero work_credits rows.",
|
|
39
|
-
},
|
|
40
|
-
observed_value: {
|
|
41
|
-
type: "number",
|
|
42
|
-
description: "Optional. The number the user is seeing somewhere else. When supplied, the response includes delta + delta_breakdown.",
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
required: ["count_source"],
|
|
46
|
-
},
|
|
47
|
-
nextSteps: [
|
|
48
|
-
{
|
|
49
|
-
tool: "pica_works_query",
|
|
50
|
-
reason: "Drill into the specific works the count covers when investigating a discrepancy.",
|
|
51
|
-
when: "on_success",
|
|
52
|
-
},
|
|
53
|
-
{
|
|
54
|
-
tool: "pica_dashboard_briefing",
|
|
55
|
-
reason: "Re-read the briefing now that the count is explained.",
|
|
56
|
-
when: "on_success",
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
},
|
|
60
|
-
executor: this.countExplain.bind(this),
|
|
61
|
-
},
|
|
62
|
-
];
|
|
63
|
-
}
|
|
64
|
-
async countExplain(args) {
|
|
65
|
-
const countSource = args.count_source;
|
|
66
|
-
const observedValueRaw = args.observed_value;
|
|
67
|
-
if (!countSource) {
|
|
68
|
-
return {
|
|
69
|
-
content: [{ type: "text", text: "count_source is required." }],
|
|
70
|
-
isError: true,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
if (!COUNT_SOURCES.includes(countSource)) {
|
|
74
|
-
return {
|
|
75
|
-
content: [
|
|
76
|
-
{
|
|
77
|
-
type: "text",
|
|
78
|
-
text: `Invalid count_source '${countSource}'. Must be one of: ${COUNT_SOURCES.join(", ")}.`,
|
|
79
|
-
},
|
|
80
|
-
],
|
|
81
|
-
isError: true,
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
let observedValue;
|
|
85
|
-
if (observedValueRaw !== undefined && observedValueRaw !== null) {
|
|
86
|
-
const parsed = Number(observedValueRaw);
|
|
87
|
-
if (!Number.isFinite(parsed) ||
|
|
88
|
-
!Number.isInteger(parsed) ||
|
|
89
|
-
parsed < 0) {
|
|
90
|
-
return {
|
|
91
|
-
content: [
|
|
92
|
-
{
|
|
93
|
-
type: "text",
|
|
94
|
-
text: "observed_value must be a non-negative integer.",
|
|
95
|
-
},
|
|
96
|
-
],
|
|
97
|
-
isError: true,
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
observedValue = parsed;
|
|
101
|
-
}
|
|
102
|
-
try {
|
|
103
|
-
const result = await this.pica.countExplain.explain({
|
|
104
|
-
count_source: countSource,
|
|
105
|
-
observed_value: observedValue,
|
|
106
|
-
});
|
|
107
|
-
const verdict = result.delta == null
|
|
108
|
-
? `${result.source.name} = ${result.computed_value}`
|
|
109
|
-
: result.delta === 0
|
|
110
|
-
? `${result.source.name} = ${result.computed_value} (matches your observed value)`
|
|
111
|
-
: `${result.source.name} = ${result.computed_value} (differs from observed by ${result.delta})`;
|
|
112
|
-
return formatSuccess(verdict, result);
|
|
113
|
-
}
|
|
114
|
-
catch (err) {
|
|
115
|
-
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
116
|
-
// INVALID_INPUT bubbles up from the API — surface message as-is.
|
|
117
|
-
if (/INVALID_INPUT|invalid_input|400/i.test(errorMessage)) {
|
|
118
|
-
return {
|
|
119
|
-
content: [
|
|
120
|
-
{
|
|
121
|
-
type: "text",
|
|
122
|
-
text: `count_source not recognised. Allowed values: ${COUNT_SOURCES.join(", ")}.`,
|
|
123
|
-
},
|
|
124
|
-
],
|
|
125
|
-
isError: true,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
return {
|
|
129
|
-
content: [
|
|
130
|
-
{ type: "text", text: `Failed to explain count: ${errorMessage}` },
|
|
131
|
-
],
|
|
132
|
-
isError: true,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
//# sourceMappingURL=explainability.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"explainability.js","sourceRoot":"","sources":["../../src/tools/explainability.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* My-Recent-Questions Tool — ADR-226 Phase 5.
|
|
3
|
-
*
|
|
4
|
-
* The user-facing auditability surface over the Phase 4 substrate. Lets the
|
|
5
|
-
* caller see what they have been asking the AI to do, what tools ran, and
|
|
6
|
-
* which client the request came from ("Claude Desktop did X / ChatGPT did
|
|
7
|
-
* Y"). User-scoped via the `(user_id = auth.uid())` RLS policy added in
|
|
8
|
-
* PR #255 + service-role + explicit user_id filter in the API route.
|
|
9
|
-
*
|
|
10
|
-
* Filters mirror the Atlas's "what did I ask the AI?" question shape — see
|
|
11
|
-
* `creator-question-atlas.ts` entry resolving to this tool.
|
|
12
|
-
*/
|
|
13
|
-
import { PicaClient } from "@withpica/mcp-sdk";
|
|
14
|
-
import { Tier, ToolDefinition, ToolExecutor } from "./index.js";
|
|
15
|
-
export declare class MyRecentQuestionsTools {
|
|
16
|
-
private pica;
|
|
17
|
-
private getTier;
|
|
18
|
-
constructor(pica: PicaClient, getTier: (name: string) => Tier | undefined);
|
|
19
|
-
getTools(): Array<{
|
|
20
|
-
definition: ToolDefinition;
|
|
21
|
-
executor: ToolExecutor;
|
|
22
|
-
}>;
|
|
23
|
-
private listMine;
|
|
24
|
-
}
|
|
25
|
-
//# sourceMappingURL=my-recent-questions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"my-recent-questions.d.ts","sourceRoot":"","sources":["../../src/tools/my-recent-questions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AA0C5E,qBAAa,sBAAsB;IACjC,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,OAAO,CAAqC;gBAGlD,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,SAAS;IAM7C,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YAyD3D,QAAQ;CAqFvB"}
|
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
-
/**
|
|
3
|
-
* ADR-230 — derive the dominant tier for a row in
|
|
4
|
-
* `assistant_interactions`. The substrate stores `tools_used: text[]`
|
|
5
|
-
* but no `tier` column of its own (Stage 1 decision: Option A — JOIN
|
|
6
|
-
* at read time rather than denormalize).
|
|
7
|
-
*
|
|
8
|
-
* If a row's tools_used spans multiple tiers (e.g. a workflow that
|
|
9
|
-
* runs `pica_works_query` then `pica_works_create` then
|
|
10
|
-
* `pica_works_delete`), surface the most-impactful tier — agents
|
|
11
|
-
* inspecting their own activity want to see the highest-stakes call,
|
|
12
|
-
* not the first one. Order: destructive > write > draft > read.
|
|
13
|
-
*
|
|
14
|
-
* The tier resolver is injected so this module stays decoupled from
|
|
15
|
-
* the registry it reads. ToolRegistry passes
|
|
16
|
-
* `(name) => this.tools.get(name)?.definition.tier` — the declared
|
|
17
|
-
* `tier` on each tool definition is the source of truth (lint Rule 13
|
|
18
|
-
* makes it required for every customer MCP tool).
|
|
19
|
-
*/
|
|
20
|
-
const TIER_RANK = {
|
|
21
|
-
read: 0,
|
|
22
|
-
draft: 1,
|
|
23
|
-
write: 2,
|
|
24
|
-
destructive: 3,
|
|
25
|
-
};
|
|
26
|
-
function dominantTier(tools, getTier) {
|
|
27
|
-
if (!Array.isArray(tools) || tools.length === 0)
|
|
28
|
-
return "read";
|
|
29
|
-
let highest = "read";
|
|
30
|
-
for (const t of tools) {
|
|
31
|
-
const tier = getTier(t) ?? "read";
|
|
32
|
-
if (TIER_RANK[tier] > TIER_RANK[highest]) {
|
|
33
|
-
highest = tier;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return highest;
|
|
37
|
-
}
|
|
38
|
-
export class MyRecentQuestionsTools {
|
|
39
|
-
pica;
|
|
40
|
-
getTier;
|
|
41
|
-
constructor(pica, getTier) {
|
|
42
|
-
this.pica = pica;
|
|
43
|
-
this.getTier = getTier;
|
|
44
|
-
}
|
|
45
|
-
getTools() {
|
|
46
|
-
return [
|
|
47
|
-
{
|
|
48
|
-
definition: {
|
|
49
|
-
name: "pica_my_recent_questions",
|
|
50
|
-
tier: "read",
|
|
51
|
-
description: "Use when the user asks: 'what did I ask the AI?', 'what have I been doing?', 'show me my recent activity', 'what AI tasks did I confirm?'. " +
|
|
52
|
-
"Returns the user's recent questions, what tools the AI ran, and whether each succeeded. " +
|
|
53
|
-
"Renders the originating client per row by joining mcp_sessions, so 'Claude Desktop did X / ChatGPT did Y' is visible at a glance. " +
|
|
54
|
-
"Each row carries `tier` (read | draft | write | destructive — the most-impactful tier across the row's tools_used) so agents can scan stakes at a glance. " +
|
|
55
|
-
"→ then: pica_continue (pick up where you left off)",
|
|
56
|
-
workflows: "infrastructure",
|
|
57
|
-
vernacular_kind: "creator-entry",
|
|
58
|
-
inputSchema: {
|
|
59
|
-
type: "object",
|
|
60
|
-
properties: {
|
|
61
|
-
session_id: {
|
|
62
|
-
type: "string",
|
|
63
|
-
description: "Optional. Filter to a single MCP session — useful for replaying one conversation.",
|
|
64
|
-
},
|
|
65
|
-
since: {
|
|
66
|
-
type: "string",
|
|
67
|
-
description: "Optional. ISO 8601 timestamp lower bound (e.g. '2026-05-01T00:00:00Z').",
|
|
68
|
-
},
|
|
69
|
-
success: {
|
|
70
|
-
type: "boolean",
|
|
71
|
-
description: "Optional. Pass `true` to see only successful interactions, `false` to see only failures.",
|
|
72
|
-
},
|
|
73
|
-
intent: {
|
|
74
|
-
type: "string",
|
|
75
|
-
description: "Optional. Filter to a specific intent (e.g. 'pica_works_create').",
|
|
76
|
-
},
|
|
77
|
-
limit: {
|
|
78
|
-
type: "number",
|
|
79
|
-
description: "Optional. Default 25, max 100.",
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
nextSteps: [
|
|
84
|
-
{
|
|
85
|
-
tool: "pica_continue",
|
|
86
|
-
reason: "Pick up where you left off — surfaces specific named open loops from the same substrate.",
|
|
87
|
-
when: "on_success",
|
|
88
|
-
},
|
|
89
|
-
],
|
|
90
|
-
},
|
|
91
|
-
executor: this.listMine.bind(this),
|
|
92
|
-
},
|
|
93
|
-
];
|
|
94
|
-
}
|
|
95
|
-
async listMine(args) {
|
|
96
|
-
const limitArg = typeof args.limit === "number" ? args.limit : undefined;
|
|
97
|
-
const limit = limitArg !== undefined ? Math.min(Math.max(limitArg, 1), 100) : undefined;
|
|
98
|
-
const rawRows = await this.pica.assistantInteractions.listRecent({
|
|
99
|
-
sessionId: typeof args.session_id === "string" ? args.session_id : undefined,
|
|
100
|
-
since: typeof args.since === "string" ? args.since : undefined,
|
|
101
|
-
success: typeof args.success === "boolean" ? args.success : undefined,
|
|
102
|
-
intent: typeof args.intent === "string" ? args.intent : undefined,
|
|
103
|
-
limit,
|
|
104
|
-
});
|
|
105
|
-
// ADR-230 — derive tier per row at read time from tools_used
|
|
106
|
-
// (assistant_interactions has no tier column; Stage 1 picked
|
|
107
|
-
// Option A — registry-derived lookup over column denormalisation).
|
|
108
|
-
const rows = Array.isArray(rawRows)
|
|
109
|
-
? rawRows.map((r) => ({
|
|
110
|
-
...r,
|
|
111
|
-
tier: dominantTier((Array.isArray(r.tools_used) ? r.tools_used : []), this.getTier),
|
|
112
|
-
}))
|
|
113
|
-
: rawRows;
|
|
114
|
-
if (!Array.isArray(rows) || rows.length === 0) {
|
|
115
|
-
return {
|
|
116
|
-
content: [
|
|
117
|
-
{
|
|
118
|
-
type: "text",
|
|
119
|
-
text: "No recent activity for your account. Once you start asking PICA to do things, this is where you'll see them.",
|
|
120
|
-
},
|
|
121
|
-
],
|
|
122
|
-
structuredContent: {
|
|
123
|
-
kind: "pica.card.my_recent_questions",
|
|
124
|
-
version: 1,
|
|
125
|
-
data: { count: 0, interactions: [] },
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
const lines = rows.slice(0, 10).map((r) => {
|
|
130
|
-
const tag = r.success
|
|
131
|
-
? r.required_confirmation && r.was_confirmed !== true
|
|
132
|
-
? "⏳ awaiting"
|
|
133
|
-
: "✓"
|
|
134
|
-
: "✗";
|
|
135
|
-
const client = r.client_name
|
|
136
|
-
? `${r.client_name}${r.client_version ? ` v${r.client_version}` : ""}`
|
|
137
|
-
: "unknown client";
|
|
138
|
-
const summary = r.result_summary ?? r.prompt_excerpt ?? r.intent;
|
|
139
|
-
const tools = Array.isArray(r.tools_used) && r.tools_used.length > 0
|
|
140
|
-
? ` — \`${r.tools_used.slice(0, 3).join(", ")}\``
|
|
141
|
-
: "";
|
|
142
|
-
const when = formatWhen(r.created_at);
|
|
143
|
-
return `[${tag}] ${client} ${when}: ${truncate(summary, 140)}${tools}`;
|
|
144
|
-
});
|
|
145
|
-
const more = rows.length > 10
|
|
146
|
-
? `\n\n_+${rows.length - 10} more — pass a higher limit to see them._`
|
|
147
|
-
: "";
|
|
148
|
-
return {
|
|
149
|
-
content: [
|
|
150
|
-
{
|
|
151
|
-
type: "text",
|
|
152
|
-
text: `${rows.length} recent interaction${rows.length === 1 ? "" : "s"}:\n\n` +
|
|
153
|
-
`${lines.join("\n")}${more}`,
|
|
154
|
-
},
|
|
155
|
-
],
|
|
156
|
-
structuredContent: {
|
|
157
|
-
kind: "pica.card.my_recent_questions",
|
|
158
|
-
version: 1,
|
|
159
|
-
data: {
|
|
160
|
-
count: rows.length,
|
|
161
|
-
interactions: rows,
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
function truncate(text, max) {
|
|
168
|
-
if (text.length <= max)
|
|
169
|
-
return text;
|
|
170
|
-
return text.slice(0, max - 1) + "…";
|
|
171
|
-
}
|
|
172
|
-
function formatWhen(iso) {
|
|
173
|
-
const then = new Date(iso).getTime();
|
|
174
|
-
const diffMs = Date.now() - then;
|
|
175
|
-
const minutes = Math.floor(diffMs / 60000);
|
|
176
|
-
if (minutes < 1)
|
|
177
|
-
return "just now";
|
|
178
|
-
if (minutes < 60)
|
|
179
|
-
return `${minutes}m ago`;
|
|
180
|
-
const hours = Math.floor(minutes / 60);
|
|
181
|
-
if (hours < 24)
|
|
182
|
-
return `${hours}h ago`;
|
|
183
|
-
const days = Math.floor(hours / 24);
|
|
184
|
-
return `${days}d ago`;
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=my-recent-questions.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"my-recent-questions.js","sourceRoot":"","sources":["../../src/tools/my-recent-questions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ADR-231 — User-Initiated Asset Sharing via Creator MCP.
|
|
3
|
-
*
|
|
4
|
-
* Tool: pica_share_send
|
|
5
|
-
*
|
|
6
|
-
* Atlas vernacular phrasings (registered separately via Atlas seed,
|
|
7
|
-
* but documented here for traceability):
|
|
8
|
-
* - "send <asset> to <name>"
|
|
9
|
-
* - "share <asset> with <name>"
|
|
10
|
-
* - "email <asset> to <person>"
|
|
11
|
-
* - "shoot <asset> over to <name>"
|
|
12
|
-
* - "send <asset> to <email>"
|
|
13
|
-
* - "forward <asset> to <person>"
|
|
14
|
-
*
|
|
15
|
-
* Per ADR-226 vernacular Atlas substrate.
|
|
16
|
-
*/
|
|
17
|
-
import { PicaClient } from "@withpica/mcp-sdk";
|
|
18
|
-
import { ToolDefinition, ToolExecutor } from "./index.js";
|
|
19
|
-
export declare class ShareSendTools {
|
|
20
|
-
private pica;
|
|
21
|
-
constructor(pica: PicaClient);
|
|
22
|
-
getTools(): Array<{
|
|
23
|
-
definition: ToolDefinition;
|
|
24
|
-
executor: ToolExecutor;
|
|
25
|
-
}>;
|
|
26
|
-
private shareSend;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=share-send.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"share-send.d.ts","sourceRoot":"","sources":["../../src/tools/share-send.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAGtE,qBAAa,cAAc;IACb,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEpC,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YAmF3D,SAAS;CA+BxB"}
|
package/dist/tools/share-send.js
DELETED
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
-
import { formatStructured, formatSuccess } from "@withpica/mcp-utils";
|
|
3
|
-
export class ShareSendTools {
|
|
4
|
-
pica;
|
|
5
|
-
constructor(pica) {
|
|
6
|
-
this.pica = pica;
|
|
7
|
-
}
|
|
8
|
-
getTools() {
|
|
9
|
-
return [
|
|
10
|
-
{
|
|
11
|
-
definition: {
|
|
12
|
-
name: "pica_share_send",
|
|
13
|
-
tier: "write",
|
|
14
|
-
workflows: "infrastructure",
|
|
15
|
-
vernacular_kind: "creator-entry",
|
|
16
|
-
description: "Use when the user asks: 'send this song to my publisher', " +
|
|
17
|
-
"'share this work with sarah', 'email the report to my manager', " +
|
|
18
|
-
"'shoot this over to <name>', 'forward to <email>'. " +
|
|
19
|
-
"Sends a withPICA-branded email containing a scoped, expirable " +
|
|
20
|
-
"share-link to a named recipient. Recipients can be PICA users, " +
|
|
21
|
-
"existing org collaborators (people you've credited on works), " +
|
|
22
|
-
"or any external email address. " +
|
|
23
|
-
"First send to a NEW external email returns " +
|
|
24
|
-
"FIRST_EXTERNAL_SEND_CONFIRMATION_REQUIRED — re-call with " +
|
|
25
|
-
"confirm_first_external_send: true to proceed (deliberate friction " +
|
|
26
|
-
"against typo-driven phishing). Sender capped at 20 external " +
|
|
27
|
-
"sends / 24h. Recipient capped at 20 marketing+share emails / 30d " +
|
|
28
|
-
"via marketing-guard. Email From is always noreply@withpica.com; " +
|
|
29
|
-
"Reply-to is the sender's email; recipient can report unwanted " +
|
|
30
|
-
"contact via a footer link in the email. v1 supports entity_type " +
|
|
31
|
-
"= 'work' only (other types declared but reserved).",
|
|
32
|
-
inputSchema: {
|
|
33
|
-
type: "object",
|
|
34
|
-
properties: {
|
|
35
|
-
entity_type: {
|
|
36
|
-
type: "string",
|
|
37
|
-
enum: ["recording", "work", "audio_file", "document"],
|
|
38
|
-
description: "Asset class. v1: only 'work' is supported; other values return ENTITY_TYPE_NOT_SUPPORTED.",
|
|
39
|
-
},
|
|
40
|
-
entity_id: {
|
|
41
|
-
type: "string",
|
|
42
|
-
description: "UUID of the asset being shared.",
|
|
43
|
-
},
|
|
44
|
-
recipient: {
|
|
45
|
-
type: "object",
|
|
46
|
-
description: "Who to send to. { kind: 'user_id' | 'collaborator_id' | 'email', value: <id-or-email> }. Internal users and existing org collaborators are detected automatically when kind='email'; otherwise the address is classified external and goes through the first-send confirmation + marketing-guard.",
|
|
47
|
-
properties: {
|
|
48
|
-
kind: {
|
|
49
|
-
type: "string",
|
|
50
|
-
enum: ["user_id", "collaborator_id", "email"],
|
|
51
|
-
description: "user_id = existing PICA user; collaborator_id = a person from the sender's org; email = arbitrary address (internal user / collaborator detected automatically; otherwise classified external).",
|
|
52
|
-
},
|
|
53
|
-
value: { type: "string" },
|
|
54
|
-
},
|
|
55
|
-
required: ["kind", "value"],
|
|
56
|
-
},
|
|
57
|
-
note: {
|
|
58
|
-
type: "string",
|
|
59
|
-
description: "Optional message from the sender (≤500 chars). Rendered in italic above the share-link CTA.",
|
|
60
|
-
},
|
|
61
|
-
expires_in_days: {
|
|
62
|
-
type: "number",
|
|
63
|
-
description: "Share-link TTL in days. Default 30, max 90.",
|
|
64
|
-
},
|
|
65
|
-
scope: {
|
|
66
|
-
type: "string",
|
|
67
|
-
enum: ["view", "view+download"],
|
|
68
|
-
description: "Default 'view'. 'view+download' allows the recipient to download attached files.",
|
|
69
|
-
},
|
|
70
|
-
confirm_first_external_send: {
|
|
71
|
-
type: "boolean",
|
|
72
|
-
description: "Required on the second call when the first attempt returned FIRST_EXTERNAL_SEND_CONFIRMATION_REQUIRED — confirms the recipient address is correct.",
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
required: ["entity_type", "entity_id", "recipient"],
|
|
76
|
-
},
|
|
77
|
-
annotations: { destructiveHint: true, openWorldHint: true },
|
|
78
|
-
},
|
|
79
|
-
executor: this.shareSend.bind(this),
|
|
80
|
-
},
|
|
81
|
-
];
|
|
82
|
-
}
|
|
83
|
-
async shareSend(args) {
|
|
84
|
-
try {
|
|
85
|
-
const result = await this.pica.shareSend.send({
|
|
86
|
-
entity_type: args.entity_type,
|
|
87
|
-
entity_id: args.entity_id,
|
|
88
|
-
recipient: args.recipient,
|
|
89
|
-
note: args.note,
|
|
90
|
-
expires_in_days: args.expires_in_days,
|
|
91
|
-
scope: args.scope,
|
|
92
|
-
confirm_first_external_send: args.confirm_first_external_send === true ? true : undefined,
|
|
93
|
-
});
|
|
94
|
-
return formatSuccess(`shared via withPICA — ${result.recipient_resolution.classification}`, result);
|
|
95
|
-
}
|
|
96
|
-
catch (e) {
|
|
97
|
-
const errCode = e?.error_code ?? e?.code ?? "SHARE_SEND_ERROR";
|
|
98
|
-
const status = e?.status ?? e?.statusCode;
|
|
99
|
-
return formatStructured({
|
|
100
|
-
error: e?.message ?? String(e),
|
|
101
|
-
error_code: errCode,
|
|
102
|
-
...(typeof status === "number" ? { status } : {}),
|
|
103
|
-
suggestion: suggestionFor(errCode),
|
|
104
|
-
next_tool: "pica_share_send",
|
|
105
|
-
}, "pica_share_send — error");
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
function suggestionFor(code) {
|
|
110
|
-
switch (code) {
|
|
111
|
-
case "FIRST_EXTERNAL_SEND_CONFIRMATION_REQUIRED":
|
|
112
|
-
return "First time sending to this external address. Confirm the recipient is correct, then re-call with confirm_first_external_send: true.";
|
|
113
|
-
case "ROLE_ADDRESS_REJECTED":
|
|
114
|
-
return "The address looks like a role/system inbox (noreply@, postmaster@, abuse@, etc). Pick the recipient's personal email instead.";
|
|
115
|
-
case "RECIPIENT_VOLUME_EXCEEDED":
|
|
116
|
-
return "Recipient is at withPICA's 30-day inbound volume limit. Wait for the window to clear, or contact them via another channel.";
|
|
117
|
-
case "SENDER_RATE_LIMIT_EXCEEDED":
|
|
118
|
-
return "You've sent 20+ external shares in the last 24h. Wait an hour and retry, or send to internal collaborators in the meantime.";
|
|
119
|
-
case "ENTITY_NOT_FOUND":
|
|
120
|
-
return "The asset wasn't found in your catalog. Verify entity_id with pica_works_get.";
|
|
121
|
-
case "ENTITY_TYPE_NOT_SUPPORTED":
|
|
122
|
-
return "v1 supports entity_type='work' only. Recording/audio_file/document share-send is on the roadmap.";
|
|
123
|
-
case "FORBIDDEN":
|
|
124
|
-
return "You're not a member of the asset's organisation. Switch context with pica_organisations_switch or share an asset you own.";
|
|
125
|
-
case "RECIPIENT_NOT_FOUND":
|
|
126
|
-
return "The recipient lookup failed. For collaborator_id, verify it's in your current org. For user_id, confirm the user exists.";
|
|
127
|
-
default:
|
|
128
|
-
return "Re-check the entity_id, recipient shape, and confirm_first_external_send flag against the tool description.";
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
//# sourceMappingURL=share-send.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"share-send.js","sourceRoot":"","sources":["../../src/tools/share-send.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/sharing.d.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sharing MCP Tools — ADR-232 § Decision 2
|
|
3
|
-
*
|
|
4
|
-
* pica_share_trace — explainability aggregator. Returns the unioned
|
|
5
|
-
* chain of reasons a viewer can see an entity, ranked by directness:
|
|
6
|
-
*
|
|
7
|
-
* 1. org_membership (viewer is in the calling org)
|
|
8
|
-
* 2. custody_chain (viewer's org is on the work's custody chain)
|
|
9
|
-
* 3. share_link (an active link grants viewer access)
|
|
10
|
-
* 4. cross_org_grant (viewer's org has an ADR-204 grant)
|
|
11
|
-
*
|
|
12
|
-
* Two-axis access control:
|
|
13
|
-
* - Caller NOT owner of entity → 403 INSUFFICIENT_SCOPE (don't leak
|
|
14
|
-
* ownership existence). AC-3.
|
|
15
|
-
* - Caller IS owner but viewer can't see → has_access:false with
|
|
16
|
-
* reasons:[]. Don't leak why. AC-4.
|
|
17
|
-
*/
|
|
18
|
-
import { PicaClient } from "@withpica/mcp-sdk";
|
|
19
|
-
import type { ToolDefinition, ToolExecutor } from "./index.js";
|
|
20
|
-
export declare class SharingTools {
|
|
21
|
-
private pica;
|
|
22
|
-
constructor(pica: PicaClient);
|
|
23
|
-
getTools(): Array<{
|
|
24
|
-
definition: ToolDefinition;
|
|
25
|
-
executor: ToolExecutor;
|
|
26
|
-
}>;
|
|
27
|
-
private shareTrace;
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=sharing.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sharing.d.ts","sourceRoot":"","sources":["../../src/tools/sharing.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAG3E,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAa;gBAEb,IAAI,EAAE,UAAU;IAI5B,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YA4D3D,UAAU;CA4EzB"}
|