@withpica/mcp-server 1.3.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 +1850 -0
- package/README.md +304 -0
- package/assets/fonts/GeistSans-Light.woff2 +0 -0
- package/assets/fonts/InstrumentSerif-Italic.woff2 +0 -0
- package/assets/fonts/InstrumentSerif-Regular.woff2 +0 -0
- package/dist/apps/download.d.ts +2 -0
- package/dist/apps/download.d.ts.map +1 -0
- package/dist/apps/download.js +125 -0
- package/dist/apps/download.js.map +1 -0
- package/dist/apps/generated/shared-bundle.d.ts +5 -0
- package/dist/apps/generated/shared-bundle.d.ts.map +1 -0
- package/dist/apps/generated/shared-bundle.js +7 -0
- package/dist/apps/generated/shared-bundle.js.map +1 -0
- package/dist/apps/release.d.ts +2 -0
- package/dist/apps/release.d.ts.map +1 -0
- package/dist/apps/release.js +69 -0
- package/dist/apps/release.js.map +1 -0
- package/dist/apps/shared.d.ts +15 -0
- package/dist/apps/shared.d.ts.map +1 -0
- package/dist/apps/shared.js +480 -0
- package/dist/apps/shared.js.map +1 -0
- package/dist/apps/upload.d.ts +2 -0
- package/dist/apps/upload.d.ts.map +1 -0
- package/dist/apps/upload.js +280 -0
- package/dist/apps/upload.js.map +1 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +73 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +86 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +645 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/agent-guide.d.ts +15 -0
- package/dist/resources/agent-guide.d.ts.map +1 -0
- package/dist/resources/agent-guide.js +284 -0
- package/dist/resources/agent-guide.js.map +1 -0
- package/dist/resources/index.d.ts +66 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +510 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/llms-primer.d.ts +2 -0
- package/dist/resources/llms-primer.d.ts.map +1 -0
- package/dist/resources/llms-primer.js +68 -0
- package/dist/resources/llms-primer.js.map +1 -0
- package/dist/resources/required-schemas.generated.d.ts +455 -0
- package/dist/resources/required-schemas.generated.d.ts.map +1 -0
- package/dist/resources/required-schemas.generated.js +1041 -0
- package/dist/resources/required-schemas.generated.js.map +1 -0
- package/dist/resources/required-schemas.source.d.ts +53 -0
- package/dist/resources/required-schemas.source.d.ts.map +1 -0
- package/dist/resources/required-schemas.source.js +493 -0
- package/dist/resources/required-schemas.source.js.map +1 -0
- package/dist/resources/welcome.d.ts +14 -0
- package/dist/resources/welcome.d.ts.map +1 -0
- package/dist/resources/welcome.js +26 -0
- package/dist/resources/welcome.js.map +1 -0
- package/dist/server-instructions.d.ts +60 -0
- package/dist/server-instructions.d.ts.map +1 -0
- package/dist/server-instructions.js +93 -0
- package/dist/server-instructions.js.map +1 -0
- package/dist/server.d.ts +52 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +334 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/access-simulate.d.ts +23 -0
- package/dist/tools/access-simulate.d.ts.map +1 -0
- package/dist/tools/access-simulate.js +162 -0
- package/dist/tools/access-simulate.js.map +1 -0
- package/dist/tools/agent-identity.d.ts +36 -0
- package/dist/tools/agent-identity.d.ts.map +1 -0
- package/dist/tools/agent-identity.js +274 -0
- package/dist/tools/agent-identity.js.map +1 -0
- package/dist/tools/agreement-types.d.ts +27 -0
- package/dist/tools/agreement-types.d.ts.map +1 -0
- package/dist/tools/agreement-types.js +281 -0
- package/dist/tools/agreement-types.js.map +1 -0
- package/dist/tools/agreements.d.ts +20 -0
- package/dist/tools/agreements.d.ts.map +1 -0
- package/dist/tools/agreements.js +282 -0
- package/dist/tools/agreements.js.map +1 -0
- package/dist/tools/analytics.d.ts +20 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +130 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/app-tools.d.ts +15 -0
- package/dist/tools/app-tools.d.ts.map +1 -0
- package/dist/tools/app-tools.js +388 -0
- package/dist/tools/app-tools.js.map +1 -0
- package/dist/tools/assets.d.ts +25 -0
- package/dist/tools/assets.d.ts.map +1 -0
- package/dist/tools/assets.js +454 -0
- package/dist/tools/assets.js.map +1 -0
- package/dist/tools/audio-files.d.ts +20 -0
- package/dist/tools/audio-files.d.ts.map +1 -0
- package/dist/tools/audio-files.js +409 -0
- package/dist/tools/audio-files.js.map +1 -0
- package/dist/tools/audit.d.ts +19 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +58 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/auth.d.ts +22 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +212 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/bulk.d.ts +22 -0
- package/dist/tools/bulk.d.ts.map +1 -0
- package/dist/tools/bulk.js +164 -0
- package/dist/tools/bulk.js.map +1 -0
- package/dist/tools/calendar.d.ts +15 -0
- package/dist/tools/calendar.d.ts.map +1 -0
- package/dist/tools/calendar.js +68 -0
- package/dist/tools/calendar.js.map +1 -0
- package/dist/tools/collaborators.d.ts +21 -0
- package/dist/tools/collaborators.d.ts.map +1 -0
- package/dist/tools/collaborators.js +381 -0
- package/dist/tools/collaborators.js.map +1 -0
- package/dist/tools/comparisons.d.ts +22 -0
- package/dist/tools/comparisons.d.ts.map +1 -0
- package/dist/tools/comparisons.js +80 -0
- package/dist/tools/comparisons.js.map +1 -0
- package/dist/tools/credits.d.ts +39 -0
- package/dist/tools/credits.d.ts.map +1 -0
- package/dist/tools/credits.js +541 -0
- package/dist/tools/credits.js.map +1 -0
- package/dist/tools/custody-hints.d.ts +16 -0
- package/dist/tools/custody-hints.d.ts.map +1 -0
- package/dist/tools/custody-hints.js +27 -0
- package/dist/tools/custody-hints.js.map +1 -0
- package/dist/tools/custody.d.ts +38 -0
- package/dist/tools/custody.d.ts.map +1 -0
- package/dist/tools/custody.js +281 -0
- package/dist/tools/custody.js.map +1 -0
- package/dist/tools/dashboard.d.ts +22 -0
- package/dist/tools/dashboard.d.ts.map +1 -0
- package/dist/tools/dashboard.js +258 -0
- package/dist/tools/dashboard.js.map +1 -0
- package/dist/tools/directory.d.ts +15 -0
- package/dist/tools/directory.d.ts.map +1 -0
- package/dist/tools/directory.js +107 -0
- package/dist/tools/directory.js.map +1 -0
- package/dist/tools/discovery.d.ts +49 -0
- package/dist/tools/discovery.d.ts.map +1 -0
- package/dist/tools/discovery.js +851 -0
- package/dist/tools/discovery.js.map +1 -0
- package/dist/tools/disputes.d.ts +18 -0
- package/dist/tools/disputes.d.ts.map +1 -0
- package/dist/tools/disputes.js +62 -0
- package/dist/tools/disputes.js.map +1 -0
- package/dist/tools/documents.d.ts +15 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +37 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/duplicates.d.ts +25 -0
- package/dist/tools/duplicates.d.ts.map +1 -0
- package/dist/tools/duplicates.js +108 -0
- package/dist/tools/duplicates.js.map +1 -0
- package/dist/tools/enrichment.d.ts +56 -0
- package/dist/tools/enrichment.d.ts.map +1 -0
- package/dist/tools/enrichment.js +616 -0
- package/dist/tools/enrichment.js.map +1 -0
- package/dist/tools/exports.d.ts +19 -0
- package/dist/tools/exports.d.ts.map +1 -0
- package/dist/tools/exports.js +184 -0
- package/dist/tools/exports.js.map +1 -0
- package/dist/tools/feedback.d.ts +22 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +100 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/forbidden-keywords.d.ts +62 -0
- package/dist/tools/forbidden-keywords.d.ts.map +1 -0
- package/dist/tools/forbidden-keywords.js +99 -0
- package/dist/tools/forbidden-keywords.js.map +1 -0
- package/dist/tools/gap-hints.d.ts +53 -0
- package/dist/tools/gap-hints.d.ts.map +1 -0
- package/dist/tools/gap-hints.js +245 -0
- package/dist/tools/gap-hints.js.map +1 -0
- package/dist/tools/groups.d.ts +29 -0
- package/dist/tools/groups.d.ts.map +1 -0
- package/dist/tools/groups.js +186 -0
- package/dist/tools/groups.js.map +1 -0
- package/dist/tools/import-documents.d.ts +21 -0
- package/dist/tools/import-documents.d.ts.map +1 -0
- package/dist/tools/import-documents.js +206 -0
- package/dist/tools/import-documents.js.map +1 -0
- package/dist/tools/import.d.ts +31 -0
- package/dist/tools/import.d.ts.map +1 -0
- package/dist/tools/import.js +610 -0
- package/dist/tools/import.js.map +1 -0
- package/dist/tools/index.d.ts +293 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +1182 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/integrations.d.ts +19 -0
- package/dist/tools/integrations.d.ts.map +1 -0
- package/dist/tools/integrations.js +120 -0
- package/dist/tools/integrations.js.map +1 -0
- package/dist/tools/labels.d.ts +20 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +48 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/licensing.d.ts +40 -0
- package/dist/tools/licensing.d.ts.map +1 -0
- package/dist/tools/licensing.js +436 -0
- package/dist/tools/licensing.js.map +1 -0
- package/dist/tools/memory.d.ts +21 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +120 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/metadata.d.ts +15 -0
- package/dist/tools/metadata.d.ts.map +1 -0
- package/dist/tools/metadata.js +1532 -0
- package/dist/tools/metadata.js.map +1 -0
- package/dist/tools/multimedia.d.ts +19 -0
- package/dist/tools/multimedia.d.ts.map +1 -0
- package/dist/tools/multimedia.js +371 -0
- package/dist/tools/multimedia.js.map +1 -0
- package/dist/tools/my-reported-issues.d.ts +32 -0
- package/dist/tools/my-reported-issues.d.ts.map +1 -0
- package/dist/tools/my-reported-issues.js +123 -0
- package/dist/tools/my-reported-issues.js.map +1 -0
- package/dist/tools/notes.d.ts +21 -0
- package/dist/tools/notes.d.ts.map +1 -0
- package/dist/tools/notes.js +115 -0
- package/dist/tools/notes.js.map +1 -0
- package/dist/tools/notifications.d.ts +28 -0
- package/dist/tools/notifications.d.ts.map +1 -0
- package/dist/tools/notifications.js +417 -0
- package/dist/tools/notifications.js.map +1 -0
- package/dist/tools/onboarding.d.ts +24 -0
- package/dist/tools/onboarding.d.ts.map +1 -0
- package/dist/tools/onboarding.js +81 -0
- package/dist/tools/onboarding.js.map +1 -0
- package/dist/tools/people.d.ts +254 -0
- package/dist/tools/people.d.ts.map +1 -0
- package/dist/tools/people.js +481 -0
- package/dist/tools/people.js.map +1 -0
- package/dist/tools/projects.d.ts +20 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +316 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/public-filter.d.ts +43 -0
- package/dist/tools/public-filter.d.ts.map +1 -0
- package/dist/tools/public-filter.js +356 -0
- package/dist/tools/public-filter.js.map +1 -0
- package/dist/tools/publishers.d.ts +30 -0
- package/dist/tools/publishers.d.ts.map +1 -0
- package/dist/tools/publishers.js +105 -0
- package/dist/tools/publishers.js.map +1 -0
- package/dist/tools/purchases.d.ts +27 -0
- package/dist/tools/purchases.d.ts.map +1 -0
- package/dist/tools/purchases.js +9 -0
- package/dist/tools/purchases.js.map +1 -0
- package/dist/tools/recording-attribution-hints.d.ts +24 -0
- package/dist/tools/recording-attribution-hints.d.ts.map +1 -0
- package/dist/tools/recording-attribution-hints.js +27 -0
- package/dist/tools/recording-attribution-hints.js.map +1 -0
- package/dist/tools/recordings.d.ts +96 -0
- package/dist/tools/recordings.d.ts.map +1 -0
- package/dist/tools/recordings.js +564 -0
- package/dist/tools/recordings.js.map +1 -0
- package/dist/tools/recovery-hints.d.ts +40 -0
- package/dist/tools/recovery-hints.d.ts.map +1 -0
- package/dist/tools/recovery-hints.js +827 -0
- package/dist/tools/recovery-hints.js.map +1 -0
- package/dist/tools/release-rich.d.ts +31 -0
- package/dist/tools/release-rich.d.ts.map +1 -0
- package/dist/tools/release-rich.js +245 -0
- package/dist/tools/release-rich.js.map +1 -0
- package/dist/tools/releases.d.ts +36 -0
- package/dist/tools/releases.d.ts.map +1 -0
- package/dist/tools/releases.js +649 -0
- package/dist/tools/releases.js.map +1 -0
- package/dist/tools/report-issue.d.ts +21 -0
- package/dist/tools/report-issue.d.ts.map +1 -0
- package/dist/tools/report-issue.js +101 -0
- package/dist/tools/report-issue.js.map +1 -0
- package/dist/tools/royalties.d.ts +23 -0
- package/dist/tools/royalties.d.ts.map +1 -0
- package/dist/tools/royalties.js +262 -0
- package/dist/tools/royalties.js.map +1 -0
- package/dist/tools/search.d.ts +30 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +115 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/send.d.ts +17 -0
- package/dist/tools/send.d.ts.map +1 -0
- package/dist/tools/send.js +188 -0
- package/dist/tools/send.js.map +1 -0
- package/dist/tools/sessions.d.ts +18 -0
- package/dist/tools/sessions.d.ts.map +1 -0
- package/dist/tools/sessions.js +153 -0
- package/dist/tools/sessions.js.map +1 -0
- package/dist/tools/settings.d.ts +23 -0
- package/dist/tools/settings.d.ts.map +1 -0
- package/dist/tools/settings.js +365 -0
- package/dist/tools/settings.js.map +1 -0
- package/dist/tools/share-links.d.ts +22 -0
- package/dist/tools/share-links.d.ts.map +1 -0
- package/dist/tools/share-links.js +188 -0
- package/dist/tools/share-links.js.map +1 -0
- package/dist/tools/signup.d.ts +26 -0
- package/dist/tools/signup.d.ts.map +1 -0
- package/dist/tools/signup.js +266 -0
- package/dist/tools/signup.js.map +1 -0
- package/dist/tools/split-sheets.d.ts +25 -0
- package/dist/tools/split-sheets.d.ts.map +1 -0
- package/dist/tools/split-sheets.js +309 -0
- package/dist/tools/split-sheets.js.map +1 -0
- package/dist/tools/storage-config.d.ts +13 -0
- package/dist/tools/storage-config.d.ts.map +1 -0
- package/dist/tools/storage-config.js +245 -0
- package/dist/tools/storage-config.js.map +1 -0
- package/dist/tools/subscription.d.ts +60 -0
- package/dist/tools/subscription.d.ts.map +1 -0
- package/dist/tools/subscription.js +440 -0
- package/dist/tools/subscription.js.map +1 -0
- package/dist/tools/sync-placements.d.ts +31 -0
- package/dist/tools/sync-placements.d.ts.map +1 -0
- package/dist/tools/sync-placements.js +431 -0
- package/dist/tools/sync-placements.js.map +1 -0
- package/dist/tools/team.d.ts +22 -0
- package/dist/tools/team.d.ts.map +1 -0
- package/dist/tools/team.js +144 -0
- package/dist/tools/team.js.map +1 -0
- package/dist/tools/telegram.d.ts +21 -0
- package/dist/tools/telegram.d.ts.map +1 -0
- package/dist/tools/telegram.js +144 -0
- package/dist/tools/telegram.js.map +1 -0
- package/dist/tools/uploads.d.ts +17 -0
- package/dist/tools/uploads.d.ts.map +1 -0
- package/dist/tools/uploads.js +165 -0
- package/dist/tools/uploads.js.map +1 -0
- package/dist/tools/works.d.ts +71 -0
- package/dist/tools/works.d.ts.map +1 -0
- package/dist/tools/works.js +694 -0
- package/dist/tools/works.js.map +1 -0
- package/package.json +54 -0
- package/scripts/build-required-schemas.ts +233 -0
- package/scripts/bundle-apps.ts +61 -0
- package/scripts/refresh-schema-mirror.ts +182 -0
- package/server.json +20 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
/**
|
|
3
|
+
* Read MCP_GAP_HINTS_ENABLED at call time. Not cached so tests can flip
|
|
4
|
+
* it per-case. Returns true only for the explicit "1" value, mirroring
|
|
5
|
+
* the MCP_LAYERED_DISCOVERY pattern at mcp-server/src/config.ts.
|
|
6
|
+
*/
|
|
7
|
+
export function gapHintsEnabled() {
|
|
8
|
+
return process.env.MCP_GAP_HINTS_ENABLED === "1";
|
|
9
|
+
}
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// pica_works_inspect
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/**
|
|
14
|
+
* A work is missing an executed agreement when:
|
|
15
|
+
* - the `agreements` section is empty, OR
|
|
16
|
+
* - none of its agreements have a fully-executed status
|
|
17
|
+
*
|
|
18
|
+
* We stay conservative — only fire when there's a clear gap, not when
|
|
19
|
+
* the caller just didn't request the agreements section.
|
|
20
|
+
*/
|
|
21
|
+
export function computeWorkGapHints(workResult) {
|
|
22
|
+
if (!gapHintsEnabled())
|
|
23
|
+
return [];
|
|
24
|
+
const hints = [];
|
|
25
|
+
const work = (workResult.work ?? {});
|
|
26
|
+
const workId = work.id ?? null;
|
|
27
|
+
const agreements = Array.isArray(workResult.agreements)
|
|
28
|
+
? workResult.agreements
|
|
29
|
+
: null;
|
|
30
|
+
const hasExecutedAgreement = agreements !== null &&
|
|
31
|
+
agreements.some((a) => {
|
|
32
|
+
const status = a.status || "";
|
|
33
|
+
return status === "fully_executed" || status === "active";
|
|
34
|
+
});
|
|
35
|
+
if (agreements !== null && !hasExecutedAgreement && workId) {
|
|
36
|
+
hints.push({
|
|
37
|
+
gap: "missing_executed_agreement",
|
|
38
|
+
capability: "email_search",
|
|
39
|
+
rationale: "find the signed co-writer or collaborator agreement so the work has provenance",
|
|
40
|
+
query_shape: "from:{writer_emails} subject:(agreement OR contract OR split) has:attachment",
|
|
41
|
+
then_call: "pica_enrichment_propose",
|
|
42
|
+
then_args_shape: {
|
|
43
|
+
entity_type: "agreement",
|
|
44
|
+
proposal_action: "create",
|
|
45
|
+
parent_entity_type: "work",
|
|
46
|
+
parent_entity_id: workId,
|
|
47
|
+
proposed_fields: {
|
|
48
|
+
title: "<from attachment>",
|
|
49
|
+
agreement_type: "<from content>",
|
|
50
|
+
other_party_name: "<counterparty>",
|
|
51
|
+
fully_executed_date: "<ISO date from signatures>",
|
|
52
|
+
},
|
|
53
|
+
sources: [
|
|
54
|
+
{
|
|
55
|
+
url: "gmail://thread-id/<id>",
|
|
56
|
+
fields: [
|
|
57
|
+
"title",
|
|
58
|
+
"agreement_type",
|
|
59
|
+
"other_party_name",
|
|
60
|
+
"fully_executed_date",
|
|
61
|
+
],
|
|
62
|
+
accessed_at: "<iso>",
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return hints;
|
|
69
|
+
}
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
// pica_agreements_inspect
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
export function computeAgreementGapHints(agreementResult) {
|
|
74
|
+
if (!gapHintsEnabled())
|
|
75
|
+
return [];
|
|
76
|
+
const hints = [];
|
|
77
|
+
const agreement = (agreementResult.agreement ?? {});
|
|
78
|
+
const agreementId = agreement.id ?? null;
|
|
79
|
+
const status = agreement.status ?? "";
|
|
80
|
+
const executedDate = agreement.fully_executed_date;
|
|
81
|
+
const documentUrl = agreement.document_url;
|
|
82
|
+
if (!agreementId)
|
|
83
|
+
return [];
|
|
84
|
+
const isExecuted = status === "fully_executed" || status === "active";
|
|
85
|
+
if (!executedDate && !isExecuted) {
|
|
86
|
+
hints.push({
|
|
87
|
+
gap: "missing_execution_date",
|
|
88
|
+
capability: "email_search",
|
|
89
|
+
rationale: "find the countersigned copy of this agreement to confirm the execution date",
|
|
90
|
+
query_shape: `subject:("${agreement.title || "agreement"}" OR countersigned) has:attachment`,
|
|
91
|
+
then_call: "pica_enrichment_propose",
|
|
92
|
+
then_args_shape: {
|
|
93
|
+
entity_type: "agreement",
|
|
94
|
+
entity_id: agreementId,
|
|
95
|
+
proposal_action: "update",
|
|
96
|
+
proposed_fields: {
|
|
97
|
+
fully_executed_date: "<ISO date from attachment>",
|
|
98
|
+
status: "fully_executed",
|
|
99
|
+
},
|
|
100
|
+
sources: [
|
|
101
|
+
{
|
|
102
|
+
url: "gmail://thread-id/<id>",
|
|
103
|
+
fields: ["fully_executed_date", "status"],
|
|
104
|
+
accessed_at: "<iso>",
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (!documentUrl) {
|
|
111
|
+
hints.push({
|
|
112
|
+
gap: "missing_document",
|
|
113
|
+
capability: "drive_search",
|
|
114
|
+
rationale: "the agreement has no stored document — locate the signed copy in shared storage",
|
|
115
|
+
query_shape: `name:("${agreement.title || "agreement"}" OR contract) type:pdf`,
|
|
116
|
+
then_call: "pica_enrichment_propose",
|
|
117
|
+
then_args_shape: {
|
|
118
|
+
entity_type: "agreement",
|
|
119
|
+
entity_id: agreementId,
|
|
120
|
+
proposal_action: "update",
|
|
121
|
+
proposed_fields: {
|
|
122
|
+
document_url: "<gdrive:// or https:// url>",
|
|
123
|
+
},
|
|
124
|
+
sources: [
|
|
125
|
+
{
|
|
126
|
+
url: "gdrive://file-id/<id>",
|
|
127
|
+
fields: ["document_url"],
|
|
128
|
+
accessed_at: "<iso>",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
},
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
return hints;
|
|
135
|
+
}
|
|
136
|
+
// ---------------------------------------------------------------------------
|
|
137
|
+
// pica_people_inspect
|
|
138
|
+
// ---------------------------------------------------------------------------
|
|
139
|
+
export function computePersonGapHints(personResult) {
|
|
140
|
+
if (!gapHintsEnabled())
|
|
141
|
+
return [];
|
|
142
|
+
const hints = [];
|
|
143
|
+
const person = (personResult.person ?? {});
|
|
144
|
+
const personId = person.id ?? null;
|
|
145
|
+
const email = person.email;
|
|
146
|
+
const name = person.name || "this person";
|
|
147
|
+
const identifiers = Array.isArray(personResult.identifiers)
|
|
148
|
+
? personResult.identifiers
|
|
149
|
+
: [];
|
|
150
|
+
const identifierTypes = new Set(identifiers.map((i) => i.type || ""));
|
|
151
|
+
if (!personId)
|
|
152
|
+
return [];
|
|
153
|
+
if (!email) {
|
|
154
|
+
hints.push({
|
|
155
|
+
gap: "missing_email",
|
|
156
|
+
capability: "email_search",
|
|
157
|
+
rationale: `find an email thread that mentions ${name} so their contact can be captured with provenance`,
|
|
158
|
+
query_shape: `"${name}" in:anywhere`,
|
|
159
|
+
then_call: "pica_enrichment_propose",
|
|
160
|
+
then_args_shape: {
|
|
161
|
+
entity_type: "person",
|
|
162
|
+
entity_id: personId,
|
|
163
|
+
proposal_action: "update",
|
|
164
|
+
proposed_fields: {
|
|
165
|
+
email: "<extracted address>",
|
|
166
|
+
},
|
|
167
|
+
sources: [
|
|
168
|
+
{
|
|
169
|
+
url: "gmail://message-id/<id>",
|
|
170
|
+
fields: ["email"],
|
|
171
|
+
accessed_at: "<iso>",
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
},
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
const hasAnyIndustryId = identifierTypes.has("ipi") ||
|
|
178
|
+
identifierTypes.has("isni") ||
|
|
179
|
+
identifierTypes.has("ipn");
|
|
180
|
+
if (!hasAnyIndustryId) {
|
|
181
|
+
hints.push({
|
|
182
|
+
gap: "missing_industry_identifier",
|
|
183
|
+
capability: "web_search",
|
|
184
|
+
rationale: `find ${name}'s IPI, ISNI, or IPN in a public registry so downstream registration can complete`,
|
|
185
|
+
query_shape: `"${name}" (IPI OR ISNI) site:(isni.org OR musicbrainz.org OR themlc.com)`,
|
|
186
|
+
then_call: "pica_enrichment_propose",
|
|
187
|
+
then_args_shape: {
|
|
188
|
+
entity_type: "person",
|
|
189
|
+
entity_id: personId,
|
|
190
|
+
proposal_action: "update",
|
|
191
|
+
proposed_fields: {
|
|
192
|
+
ipi: "<11-digit IPI>",
|
|
193
|
+
},
|
|
194
|
+
sources: [
|
|
195
|
+
{
|
|
196
|
+
url: "web://https://isni.org/isni/<id>",
|
|
197
|
+
fields: ["ipi"],
|
|
198
|
+
accessed_at: "<iso>",
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return hints;
|
|
205
|
+
}
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
// pica_enrichment_proposals_list
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
/**
|
|
210
|
+
* When the pending-proposals list is empty, surface a hint reminding
|
|
211
|
+
* the agent that peer MCPs may hold evidence that would produce
|
|
212
|
+
* proposals. This is the weakest of the four surfaces — the list tool
|
|
213
|
+
* doesn't know which entity's proposals are missing — so we only fire
|
|
214
|
+
* on the empty case and cite the generic flow.
|
|
215
|
+
*/
|
|
216
|
+
export function computeProposalListGapHints(listResult) {
|
|
217
|
+
if (!gapHintsEnabled())
|
|
218
|
+
return [];
|
|
219
|
+
if (!Array.isArray(listResult) || listResult.length > 0)
|
|
220
|
+
return [];
|
|
221
|
+
return [
|
|
222
|
+
{
|
|
223
|
+
gap: "no_pending_proposals",
|
|
224
|
+
capability: "email_search",
|
|
225
|
+
rationale: "no proposals are queued — if the user mentioned missing splits or contracts, check their mailbox for correspondence and file evidence via pica_enrichment_propose",
|
|
226
|
+
query_shape: "subject:(split OR agreement OR royalty) newer_than:90d",
|
|
227
|
+
then_call: "pica_enrichment_propose",
|
|
228
|
+
then_args_shape: {
|
|
229
|
+
entity_type: "<work|recording|person|agreement>",
|
|
230
|
+
entity_id: "<target id>",
|
|
231
|
+
proposed_fields: {
|
|
232
|
+
/* from the email */
|
|
233
|
+
},
|
|
234
|
+
sources: [
|
|
235
|
+
{
|
|
236
|
+
url: "gmail://thread-id/<id>",
|
|
237
|
+
fields: ["..."],
|
|
238
|
+
accessed_at: "<iso>",
|
|
239
|
+
},
|
|
240
|
+
],
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
];
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=gap-hints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gap-hints.js","sourceRoot":"","sources":["../../src/tools/gap-hints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Groups Tools — ADR-223 Phase 5
|
|
3
|
+
*
|
|
4
|
+
* MCP write/read surface for group → member relationships on people.
|
|
5
|
+
* Four tools:
|
|
6
|
+
* - pica_group_add_member (write, Tier 1)
|
|
7
|
+
* - pica_group_remove_member (write, Tier 1)
|
|
8
|
+
* - pica_group_list_members (read)
|
|
9
|
+
* - pica_person_list_groups (read)
|
|
10
|
+
*
|
|
11
|
+
* Server-side trigger tg_pgm_assert_parent enforces parent.is_group=true
|
|
12
|
+
* and same-org constraint on every insert. Errors map to friendly
|
|
13
|
+
* messages on the route layer.
|
|
14
|
+
*/
|
|
15
|
+
import { PicaClient } from "@withpica/mcp-sdk";
|
|
16
|
+
import { ToolDefinition, ToolExecutor } from "./index.js";
|
|
17
|
+
export declare class GroupsTools {
|
|
18
|
+
private pica;
|
|
19
|
+
constructor(pica: PicaClient);
|
|
20
|
+
getTools(): Array<{
|
|
21
|
+
definition: ToolDefinition;
|
|
22
|
+
executor: ToolExecutor;
|
|
23
|
+
}>;
|
|
24
|
+
private addMember;
|
|
25
|
+
private removeMember;
|
|
26
|
+
private listMembers;
|
|
27
|
+
private listGroups;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=groups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups.d.ts","sourceRoot":"","sources":["../../src/tools/groups.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAiBtE,qBAAa,WAAW;IACtB,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;YAiJ3D,SAAS;YAmBT,YAAY;YAcZ,WAAW;YAWX,UAAU;CASzB"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
import { formatSuccess, formatStructuredList, withBillingGate, } from "@withpica/mcp-utils";
|
|
3
|
+
const ROLE_ENUM = [
|
|
4
|
+
"member",
|
|
5
|
+
"founder",
|
|
6
|
+
"lead",
|
|
7
|
+
"touring_member",
|
|
8
|
+
"session",
|
|
9
|
+
"guest",
|
|
10
|
+
"producer_in_residence",
|
|
11
|
+
];
|
|
12
|
+
export class GroupsTools {
|
|
13
|
+
pica;
|
|
14
|
+
constructor(pica) {
|
|
15
|
+
this.pica = pica;
|
|
16
|
+
}
|
|
17
|
+
getTools() {
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
definition: {
|
|
21
|
+
name: "pica_group_add_member",
|
|
22
|
+
description: "Add a person as a member of a group person row. The group must already have is_group=true on its people record. " +
|
|
23
|
+
"Defaults: role='member', receive_notifications=true. " +
|
|
24
|
+
"→ before: pica_people_query (find both people) → then: pica_group_list_members (verify roster)",
|
|
25
|
+
workflows: "infrastructure",
|
|
26
|
+
inputSchema: {
|
|
27
|
+
type: "object",
|
|
28
|
+
properties: {
|
|
29
|
+
group_person_id: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "ID of the group person row (must have is_group=true)",
|
|
32
|
+
},
|
|
33
|
+
member_person_id: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "ID of the member person row",
|
|
36
|
+
},
|
|
37
|
+
role: {
|
|
38
|
+
type: "string",
|
|
39
|
+
enum: [...ROLE_ENUM],
|
|
40
|
+
description: "Constrained role within the group. Default 'member'.",
|
|
41
|
+
},
|
|
42
|
+
role_label: {
|
|
43
|
+
type: "string",
|
|
44
|
+
description: "Free-text label for variants outside the enum (e.g. 'lead vocalist for tour 2025'). Optional.",
|
|
45
|
+
},
|
|
46
|
+
joined_at: {
|
|
47
|
+
type: "string",
|
|
48
|
+
description: "When the member joined (ISO 8601). Omit for unknown.",
|
|
49
|
+
},
|
|
50
|
+
receive_notifications: {
|
|
51
|
+
type: "boolean",
|
|
52
|
+
description: "Whether the member's linked user account (if any) gets notifications about group activity. Default true.",
|
|
53
|
+
},
|
|
54
|
+
notification_filter: {
|
|
55
|
+
type: "array",
|
|
56
|
+
items: { type: "string" },
|
|
57
|
+
description: "Optional subset of original event types to be notified about (e.g. ['work_credit_added','agreement_party_linked']). Omit for all.",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
required: ["group_person_id", "member_person_id"],
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
executor: withBillingGate(this.pica, "group member add", this.addMember.bind(this)),
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
definition: {
|
|
67
|
+
name: "pica_group_remove_member",
|
|
68
|
+
description: "Remove a member from a group by setting left_at on the active row. The row is preserved — never deleted — so member history survives. " +
|
|
69
|
+
"→ then: pica_group_list_members (with include_inactive=true to see history)",
|
|
70
|
+
workflows: "infrastructure",
|
|
71
|
+
inputSchema: {
|
|
72
|
+
type: "object",
|
|
73
|
+
properties: {
|
|
74
|
+
group_person_id: {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "Group person ID",
|
|
77
|
+
},
|
|
78
|
+
member_person_id: {
|
|
79
|
+
type: "string",
|
|
80
|
+
description: "Member person ID",
|
|
81
|
+
},
|
|
82
|
+
left_at: {
|
|
83
|
+
type: "string",
|
|
84
|
+
description: "When they left (ISO 8601). Defaults to now.",
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
required: ["group_person_id", "member_person_id"],
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
executor: withBillingGate(this.pica, "group member remove", this.removeMember.bind(this)),
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
definition: {
|
|
94
|
+
name: "pica_group_list_members",
|
|
95
|
+
description: "List members of a group person. Active members only by default; pass include_inactive=true for history. " +
|
|
96
|
+
"→ then: pica_people_inspect (get details for a specific member)",
|
|
97
|
+
workflows: "infrastructure",
|
|
98
|
+
inputSchema: {
|
|
99
|
+
type: "object",
|
|
100
|
+
properties: {
|
|
101
|
+
group_person_id: {
|
|
102
|
+
type: "string",
|
|
103
|
+
description: "Group person ID (must have is_group=true)",
|
|
104
|
+
},
|
|
105
|
+
include_inactive: {
|
|
106
|
+
type: "boolean",
|
|
107
|
+
description: "Include rows with left_at set (past members). Default false.",
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
required: ["group_person_id"],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
executor: this.listMembers.bind(this),
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
definition: {
|
|
117
|
+
name: "pica_person_list_groups",
|
|
118
|
+
description: "List the groups a person is (or was) a member of. Active memberships only by default. " +
|
|
119
|
+
"→ then: pica_people_inspect (get group details)",
|
|
120
|
+
workflows: "infrastructure",
|
|
121
|
+
inputSchema: {
|
|
122
|
+
type: "object",
|
|
123
|
+
properties: {
|
|
124
|
+
person_id: {
|
|
125
|
+
type: "string",
|
|
126
|
+
description: "Person ID",
|
|
127
|
+
},
|
|
128
|
+
include_inactive: {
|
|
129
|
+
type: "boolean",
|
|
130
|
+
description: "Include rows with left_at set (past memberships). Default false.",
|
|
131
|
+
},
|
|
132
|
+
},
|
|
133
|
+
required: ["person_id"],
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
executor: this.listGroups.bind(this),
|
|
137
|
+
},
|
|
138
|
+
];
|
|
139
|
+
}
|
|
140
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- args bag from MCP transport
|
|
141
|
+
async addMember(args) {
|
|
142
|
+
const result = await this.pica.groups.addMember({
|
|
143
|
+
group_person_id: args.group_person_id,
|
|
144
|
+
member_person_id: args.member_person_id,
|
|
145
|
+
role: args.role,
|
|
146
|
+
role_label: args.role_label,
|
|
147
|
+
joined_at: args.joined_at,
|
|
148
|
+
receive_notifications: args.receive_notifications,
|
|
149
|
+
notification_filter: args.notification_filter,
|
|
150
|
+
});
|
|
151
|
+
const data = result?.data ?? result;
|
|
152
|
+
const role = data?.role ?? "member";
|
|
153
|
+
return formatSuccess(`Member added to group as ${role}${data?.role_label ? ` (${data.role_label})` : ""}.`, data);
|
|
154
|
+
}
|
|
155
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- args bag from MCP transport
|
|
156
|
+
async removeMember(args) {
|
|
157
|
+
const result = await this.pica.groups.removeMember({
|
|
158
|
+
group_person_id: args.group_person_id,
|
|
159
|
+
member_person_id: args.member_person_id,
|
|
160
|
+
left_at: args.left_at,
|
|
161
|
+
});
|
|
162
|
+
const data = result?.data ?? result;
|
|
163
|
+
return formatSuccess(`Member removed from group (left_at=${data?.left_at ?? "now"}). Row preserved for history.`, data);
|
|
164
|
+
}
|
|
165
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- args bag from MCP transport
|
|
166
|
+
async listMembers(args) {
|
|
167
|
+
const result = await this.pica.groups.listMembers(args.group_person_id, {
|
|
168
|
+
include_inactive: !!args.include_inactive,
|
|
169
|
+
});
|
|
170
|
+
const items = (result?.data ?? result ?? []);
|
|
171
|
+
return formatStructuredList(items, "group_membership", {
|
|
172
|
+
total: items.length,
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- args bag from MCP transport
|
|
176
|
+
async listGroups(args) {
|
|
177
|
+
const result = await this.pica.groups.listGroupsForPerson(args.person_id, {
|
|
178
|
+
include_inactive: !!args.include_inactive,
|
|
179
|
+
});
|
|
180
|
+
const items = (result?.data ?? result ?? []);
|
|
181
|
+
return formatStructuredList(items, "group_membership", {
|
|
182
|
+
total: items.length,
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=groups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groups.js","sourceRoot":"","sources":["../../src/tools/groups.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import Documents Tools - MCP tools for canonical ingestion documents
|
|
3
|
+
*/
|
|
4
|
+
import { PicaClient } from "@withpica/mcp-sdk";
|
|
5
|
+
import { ToolDefinition, ToolExecutor } from "./index.js";
|
|
6
|
+
export declare class ImportDocumentTools {
|
|
7
|
+
private pica;
|
|
8
|
+
constructor(pica: PicaClient);
|
|
9
|
+
/**
|
|
10
|
+
* Get all import document tools
|
|
11
|
+
*/
|
|
12
|
+
getTools(): Array<{
|
|
13
|
+
definition: ToolDefinition;
|
|
14
|
+
executor: ToolExecutor;
|
|
15
|
+
}>;
|
|
16
|
+
private queryImportDocuments;
|
|
17
|
+
private inspectImportDocument;
|
|
18
|
+
private ingestStatement;
|
|
19
|
+
private computeDiff;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=import-documents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-documents.d.ts","sourceRoot":"","sources":["../../src/tools/import-documents.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,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAa;gBAEb,IAAI,EAAE,UAAU;IAI5B;;OAEG;IACH,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;YA6F3D,oBAAoB;YAOpB,qBAAqB;YA+DrB,eAAe;IAgB7B,OAAO,CAAC,WAAW;CAyDpB"}
|