@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,356 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
import { PUBLIC_FORBIDDEN_KEYWORDS_FULL } from "./forbidden-keywords.js";
|
|
3
|
+
// ── Class C: explicit exclude (Phase 1: empty per ADR-202 sign-off 2026-04-27) ──
|
|
4
|
+
const CLASS_C_EXCLUDE = new Set([]);
|
|
5
|
+
// ── Class B: include name, sanitized description ──
|
|
6
|
+
// The source-of-truth descriptions in the per-domain tool files name third-party
|
|
7
|
+
// services (MLC / ISNI / MusicBrainz / Spotify / YouTube / Discogs / ACRCloud /
|
|
8
|
+
// Librosa / Groq) or internal architecture (cascade engine / Tier A/B / identity
|
|
9
|
+
// graph / CAR scoring). The strings here are rewrites that preserve capability
|
|
10
|
+
// signal without leaking the algorithm or vendor binding.
|
|
11
|
+
const CLASS_B_SANITIZED = {
|
|
12
|
+
// Reclassified from Class C → B per 2026-04-27 sign-off
|
|
13
|
+
pica_graph_traverse: "Traverse identifier-based connections from any external identifier. Returns connected works, recordings, and people across the catalog.",
|
|
14
|
+
pica_run_work_cascade: "Re-run metadata enrichment for a work to fill gaps from external sources.",
|
|
15
|
+
pica_run_person_cascade: "Re-run metadata enrichment for a person to fill gaps from external identity sources.",
|
|
16
|
+
pica_cascade_health: "Snapshot of recent metadata-enrichment activity — outcome counts and recent failures.",
|
|
17
|
+
pica_export_catalog_asset_report: "Generate a catalog asset report — a structured summary of catalog completeness and provenance.",
|
|
18
|
+
pica_car_preview: "Preview a catalog asset report inline before generating the full export.",
|
|
19
|
+
// Original Class B
|
|
20
|
+
pica_resolve_work: "Resolve a work against external metadata sources. Returns structured proposals and applied updates.",
|
|
21
|
+
pica_resolve_person: "Resolve a person against external identity sources. Returns structured proposals and applied updates.",
|
|
22
|
+
pica_resolve_recording: "Resolve a recording against external metadata sources. Returns structured proposals and applied updates.",
|
|
23
|
+
pica_enrichment_candidates: "Find catalog entries that are good candidates for metadata enrichment.",
|
|
24
|
+
pica_enrichment_compare: "Compare what external sources say about a catalog entry, side by side.",
|
|
25
|
+
pica_registrations_compare: "Compare a work's registration status across society and platform records.",
|
|
26
|
+
pica_enrichment_propose: "Propose a metadata enrichment from agent research; goes to a review queue.",
|
|
27
|
+
pica_enrichment_proposals_list: "List pending metadata-enrichment proposals awaiting review.",
|
|
28
|
+
pica_enrichment_proposal_apply: "Apply a previously proposed metadata enrichment.",
|
|
29
|
+
pica_enrichment_proposal_reject: "Reject a previously proposed metadata enrichment.",
|
|
30
|
+
pica_audio_analyze: "Analyze an audio file for tempo, key, energy, and lyric transcription.",
|
|
31
|
+
pica_audio_identify: "Identify a track via audio fingerprinting. Returns matched metadata with confidence score.",
|
|
32
|
+
pica_documents_analyse: "Analyse a document with AI. Extracts structured fields from invoices, statements, contracts.",
|
|
33
|
+
pica_import_streaming_link: "Import a work or recording from a public streaming-service link.",
|
|
34
|
+
pica_import_from_spotify: "Import a work or recording from a Spotify link.",
|
|
35
|
+
pica_import_youtube_link: "Import a recording from a YouTube link.",
|
|
36
|
+
pica_multimedia_import_url: "Import multimedia from a public URL.",
|
|
37
|
+
pica_multimedia_link_youtube: "Link a YouTube video to a work.",
|
|
38
|
+
pica_ingest_statement: "Ingest a royalty statement document into the catalog.",
|
|
39
|
+
};
|
|
40
|
+
// ── Class A: explicit allowlist, descriptions ship as-is ──
|
|
41
|
+
// Every Class A tool is enumerated here. New tools added to ToolRegistry must
|
|
42
|
+
// also be added to this list (or to CLASS_B_SANITIZED / CLASS_C_EXCLUDE) to
|
|
43
|
+
// appear on the public surface — default-exclude.
|
|
44
|
+
const CLASS_A_ALLOWLIST = new Set([
|
|
45
|
+
// Works
|
|
46
|
+
"pica_works_query",
|
|
47
|
+
"pica_works_inspect",
|
|
48
|
+
"pica_works_create",
|
|
49
|
+
"pica_works_update",
|
|
50
|
+
"pica_works_delete",
|
|
51
|
+
"pica_works_verify",
|
|
52
|
+
"pica_works_bulk_delete",
|
|
53
|
+
"pica_works_bulk_update",
|
|
54
|
+
// People
|
|
55
|
+
"pica_people_query",
|
|
56
|
+
"pica_people_inspect",
|
|
57
|
+
"pica_people_create",
|
|
58
|
+
"pica_people_update",
|
|
59
|
+
"pica_people_delete",
|
|
60
|
+
"pica_people_bulk_update_roles",
|
|
61
|
+
// Recordings
|
|
62
|
+
"pica_recordings_query",
|
|
63
|
+
"pica_recordings_inspect",
|
|
64
|
+
"pica_recordings_create",
|
|
65
|
+
"pica_recordings_update",
|
|
66
|
+
"pica_recordings_delete",
|
|
67
|
+
// Credits (work_credits)
|
|
68
|
+
"pica_credits_list",
|
|
69
|
+
"pica_credits_update",
|
|
70
|
+
// Agreements
|
|
71
|
+
"pica_agreements_query",
|
|
72
|
+
"pica_agreements_inspect",
|
|
73
|
+
"pica_agreements_create",
|
|
74
|
+
"pica_agreements_update",
|
|
75
|
+
"pica_agreements_delete",
|
|
76
|
+
"pica_agreements_link_work",
|
|
77
|
+
// Agreement types & templates
|
|
78
|
+
"pica_agreement_types_query",
|
|
79
|
+
"pica_agreement_types_inspect",
|
|
80
|
+
"pica_agreement_types_create",
|
|
81
|
+
"pica_agreement_types_update",
|
|
82
|
+
"pica_agreement_types_delete",
|
|
83
|
+
"pica_agreement_templates_render",
|
|
84
|
+
"pica_agreement_templates_duplicate",
|
|
85
|
+
"pica_agreement_templates_set_default",
|
|
86
|
+
// Splits
|
|
87
|
+
"pica_split_sheet_list",
|
|
88
|
+
"pica_split_sheet_get",
|
|
89
|
+
"pica_split_sheet_generate",
|
|
90
|
+
"pica_split_sheet_send",
|
|
91
|
+
"pica_recording_splits_list",
|
|
92
|
+
"pica_recording_splits_create",
|
|
93
|
+
"pica_recording_splits_verify",
|
|
94
|
+
// Royalties & statements
|
|
95
|
+
"pica_royalties_list",
|
|
96
|
+
"pica_royalties_get",
|
|
97
|
+
"pica_royalties_summary",
|
|
98
|
+
"pica_statements_list",
|
|
99
|
+
"pica_statements_get",
|
|
100
|
+
// Disputes
|
|
101
|
+
"pica_disputes_list",
|
|
102
|
+
// Custody (chain/ trade-secret service backs these — names + read-side
|
|
103
|
+
// descriptions are publicly used product language; algorithm stays sealed)
|
|
104
|
+
"pica_custody_list",
|
|
105
|
+
"pica_custody_history",
|
|
106
|
+
"pica_custody_claim",
|
|
107
|
+
"pica_custody_respond",
|
|
108
|
+
"pica_custody_resolve_pending",
|
|
109
|
+
"pica_custody_reconcile",
|
|
110
|
+
// Search & discovery substrate
|
|
111
|
+
"pica_search_all",
|
|
112
|
+
"pica_catalog_stats",
|
|
113
|
+
"pica_search_for_sync",
|
|
114
|
+
"pica_submit_license_enquiry",
|
|
115
|
+
"pica_claim_credit",
|
|
116
|
+
"pica_claim_custody",
|
|
117
|
+
"pica_claim_artist",
|
|
118
|
+
"pica_discoveries_query",
|
|
119
|
+
"pica_discoveries_review",
|
|
120
|
+
// Dashboard
|
|
121
|
+
"pica_dashboard_attention",
|
|
122
|
+
"pica_dashboard_briefing",
|
|
123
|
+
"pica_dashboard_pulse",
|
|
124
|
+
// MCP Apps cards (UI-only render, safe)
|
|
125
|
+
"pica_upload",
|
|
126
|
+
"pica_download",
|
|
127
|
+
// Audio (analyze + identify are Class B; the rest are A)
|
|
128
|
+
"pica_audio_query",
|
|
129
|
+
"pica_audio_inspect",
|
|
130
|
+
"pica_audio_presigned_upload",
|
|
131
|
+
"pica_audio_complete_upload",
|
|
132
|
+
// Multimedia (import_url + link_youtube are Class B; the rest are A)
|
|
133
|
+
"pica_multimedia_search",
|
|
134
|
+
"pica_multimedia_create",
|
|
135
|
+
"pica_multimedia_link_work",
|
|
136
|
+
// Uploads
|
|
137
|
+
"pica_upload_file",
|
|
138
|
+
"pica_upload_complete",
|
|
139
|
+
// Exports (CAR is Class B; the rest are A)
|
|
140
|
+
"pica_export_catalog_csv",
|
|
141
|
+
"pica_export_song_registration",
|
|
142
|
+
"pica_export_industry_ready",
|
|
143
|
+
"pica_export_ai_consent",
|
|
144
|
+
// Calendar
|
|
145
|
+
"pica_calendar_events",
|
|
146
|
+
// Duplicates
|
|
147
|
+
"pica_find_duplicates",
|
|
148
|
+
"pica_merge_duplicates",
|
|
149
|
+
// Projects
|
|
150
|
+
"pica_projects_list",
|
|
151
|
+
"pica_projects_get",
|
|
152
|
+
"pica_projects_create",
|
|
153
|
+
"pica_projects_update",
|
|
154
|
+
"pica_projects_delete",
|
|
155
|
+
"pica_projects_attach_works",
|
|
156
|
+
// Releases
|
|
157
|
+
"pica_releases_list",
|
|
158
|
+
"pica_releases_get",
|
|
159
|
+
"pica_releases_create",
|
|
160
|
+
"pica_releases_update",
|
|
161
|
+
"pica_releases_attach_track",
|
|
162
|
+
"pica_releases_list_tracks",
|
|
163
|
+
"pica_releases_detach_track",
|
|
164
|
+
"pica_releases_reorder_tracks",
|
|
165
|
+
"pica_releases_attach_recording_with_work",
|
|
166
|
+
"pica_releases_bulk_attach_tracks",
|
|
167
|
+
"pica_releases_move_track",
|
|
168
|
+
"pica_releases_attach_track_by_identifier",
|
|
169
|
+
"pica_releases_create_with_tracks",
|
|
170
|
+
"pica_releases_completeness_check",
|
|
171
|
+
// ADR-208 Phase 3 Primitive D — rich render
|
|
172
|
+
"pica_release_show",
|
|
173
|
+
// Sessions
|
|
174
|
+
"pica_sessions_list",
|
|
175
|
+
"pica_sessions_get",
|
|
176
|
+
"pica_sessions_create",
|
|
177
|
+
"pica_sessions_types",
|
|
178
|
+
// Notes
|
|
179
|
+
"pica_notes_list",
|
|
180
|
+
"pica_notes_get",
|
|
181
|
+
"pica_notes_create",
|
|
182
|
+
"pica_notes_delete",
|
|
183
|
+
// Physical assets
|
|
184
|
+
"pica_physical_assets_query",
|
|
185
|
+
"pica_physical_assets_inspect",
|
|
186
|
+
"pica_physical_assets_create",
|
|
187
|
+
"pica_physical_assets_update",
|
|
188
|
+
"pica_physical_assets_delete",
|
|
189
|
+
"pica_physical_assets_stats",
|
|
190
|
+
"pica_physical_assets_export",
|
|
191
|
+
"pica_physical_assets_link_work",
|
|
192
|
+
"pica_physical_assets_link_recording",
|
|
193
|
+
"pica_physical_assets_unlink_work",
|
|
194
|
+
"pica_physical_assets_unlink_recording",
|
|
195
|
+
// Analytics
|
|
196
|
+
"pica_carbon_footprint",
|
|
197
|
+
"pica_carbon_live",
|
|
198
|
+
"pica_provenance_stats",
|
|
199
|
+
"pica_provenance_work",
|
|
200
|
+
"pica_provenance_certificate",
|
|
201
|
+
"pica_catalog_diligence",
|
|
202
|
+
// Import (streaming/spotify/youtube/ingest_statement are Class B; the rest are A)
|
|
203
|
+
"pica_import_analyze",
|
|
204
|
+
"pica_import_validate",
|
|
205
|
+
"pica_import_execute",
|
|
206
|
+
"pica_import_fields",
|
|
207
|
+
"pica_import_template",
|
|
208
|
+
"pica_import_documents_query",
|
|
209
|
+
"pica_import_documents_inspect",
|
|
210
|
+
// Notifications
|
|
211
|
+
"pica_notifications_list",
|
|
212
|
+
"pica_notify_person",
|
|
213
|
+
"pica_notifications_mark_read",
|
|
214
|
+
// Collaborators
|
|
215
|
+
"pica_collaborators_invite",
|
|
216
|
+
"pica_collaborators_invites_list",
|
|
217
|
+
"pica_collaborators_invite_resend",
|
|
218
|
+
"pica_collaborators_incoming_list",
|
|
219
|
+
"pica_collaborators_accept",
|
|
220
|
+
"pica_collaborators_dispute",
|
|
221
|
+
"pica_collaborators_invite_bulk",
|
|
222
|
+
// Send hub
|
|
223
|
+
"pica_send_message",
|
|
224
|
+
"pica_send_query",
|
|
225
|
+
"pica_send_resend",
|
|
226
|
+
// Share links
|
|
227
|
+
"pica_share_links_list",
|
|
228
|
+
"pica_share_links_create",
|
|
229
|
+
// Telegram
|
|
230
|
+
"pica_telegram_status",
|
|
231
|
+
"pica_telegram_connect",
|
|
232
|
+
"pica_notify_user",
|
|
233
|
+
"pica_notify_user_at",
|
|
234
|
+
"pica_notify_user_list_pending",
|
|
235
|
+
"pica_notify_user_cancel",
|
|
236
|
+
// Publishers / labels
|
|
237
|
+
"pica_publishers_query",
|
|
238
|
+
"pica_publishers_create",
|
|
239
|
+
"pica_labels_query",
|
|
240
|
+
// Licensing
|
|
241
|
+
"pica_list_license_enquiries",
|
|
242
|
+
"pica_get_license_enquiry",
|
|
243
|
+
"pica_update_license_enquiry_status",
|
|
244
|
+
// Team
|
|
245
|
+
"pica_team_list",
|
|
246
|
+
"pica_team_get",
|
|
247
|
+
"pica_team_invite",
|
|
248
|
+
"pica_team_update_role",
|
|
249
|
+
"pica_team_remove",
|
|
250
|
+
// Audit
|
|
251
|
+
"pica_audit_list",
|
|
252
|
+
// Memory
|
|
253
|
+
"pica_memory_list",
|
|
254
|
+
"pica_memory_search",
|
|
255
|
+
"pica_memory_save",
|
|
256
|
+
"pica_memory_delete",
|
|
257
|
+
// Settings
|
|
258
|
+
"pica_storage_status",
|
|
259
|
+
"pica_organisation_profile",
|
|
260
|
+
"pica_user_profile",
|
|
261
|
+
"pica_directory_settings",
|
|
262
|
+
"pica_integrations_status",
|
|
263
|
+
"pica_get_privacy_settings",
|
|
264
|
+
"pica_update_privacy_settings",
|
|
265
|
+
"pica_export_my_data",
|
|
266
|
+
"pica_delete_my_account",
|
|
267
|
+
"pica_update_my_identity",
|
|
268
|
+
"pica_update_organisation_profile",
|
|
269
|
+
// Feedback / report-issue
|
|
270
|
+
"pica_submit_feedback",
|
|
271
|
+
"pica_report_issue",
|
|
272
|
+
"pica_my_reported_issues",
|
|
273
|
+
// Agent identity
|
|
274
|
+
"pica_create_agent_identity",
|
|
275
|
+
"pica_issue_agent_grant",
|
|
276
|
+
"pica_list_my_agent_grants",
|
|
277
|
+
"pica_revoke_agent_grant",
|
|
278
|
+
"pica_get_agent_activity",
|
|
279
|
+
]);
|
|
280
|
+
// ── Meta-tools — never on the public surface ──
|
|
281
|
+
// pica_discover / pica_tool_details / pica_execute only make sense once
|
|
282
|
+
// authenticated; pica_sign_in / pica_sign_out are stdio-lobby tools.
|
|
283
|
+
const META_TOOL_EXCLUDE = new Set([
|
|
284
|
+
"pica_discover",
|
|
285
|
+
"pica_tool_details",
|
|
286
|
+
"pica_execute",
|
|
287
|
+
"pica_sign_in",
|
|
288
|
+
"pica_sign_out",
|
|
289
|
+
]);
|
|
290
|
+
// ── Forbidden keywords (AC-4 in ADR-202) ──
|
|
291
|
+
// Source-of-truth list lives at `./forbidden-keywords.ts` and is shared
|
|
292
|
+
// with the `scripts/lint-mcp-tools.ts` description-hygiene check
|
|
293
|
+
// (ADR-180 Rule 9, 2026-05-02 amendment).
|
|
294
|
+
//
|
|
295
|
+
// The lobby surface uses the full union (PUBLIC ∪ AUTHENTICATED) — every
|
|
296
|
+
// vendor / data-source / infra / library / concept term that's banned for
|
|
297
|
+
// any audience is also banned at the unauthenticated boundary.
|
|
298
|
+
const FORBIDDEN_KEYWORD_FRAGMENTS = PUBLIC_FORBIDDEN_KEYWORDS_FULL;
|
|
299
|
+
/**
|
|
300
|
+
* Apply ADR-202 filtering to a list of ToolDefinitions.
|
|
301
|
+
*
|
|
302
|
+
* Order of operations:
|
|
303
|
+
* 1. Drop META_TOOL_EXCLUDE
|
|
304
|
+
* 2. Drop CLASS_C_EXCLUDE
|
|
305
|
+
* 3. Drop anything not in CLASS_A_ALLOWLIST and not in CLASS_B_SANITIZED
|
|
306
|
+
* (default-exclude)
|
|
307
|
+
* 4. If readOnlyOnly: drop tools whose risk metadata is not "safe"
|
|
308
|
+
* 5. Replace description for CLASS_B_SANITIZED entries
|
|
309
|
+
* 6. Strip executor reference (return PublicToolDefinition only)
|
|
310
|
+
*/
|
|
311
|
+
export function filterToolsForPublicDiscovery(tools, options) {
|
|
312
|
+
const readOnlyOnly = options.readOnlyOnly ?? true;
|
|
313
|
+
const result = [];
|
|
314
|
+
for (const tool of tools) {
|
|
315
|
+
if (META_TOOL_EXCLUDE.has(tool.name))
|
|
316
|
+
continue;
|
|
317
|
+
if (CLASS_C_EXCLUDE.has(tool.name))
|
|
318
|
+
continue;
|
|
319
|
+
const isB = tool.name in CLASS_B_SANITIZED;
|
|
320
|
+
const isA = CLASS_A_ALLOWLIST.has(tool.name);
|
|
321
|
+
if (!isA && !isB)
|
|
322
|
+
continue; // default-exclude
|
|
323
|
+
if (readOnlyOnly) {
|
|
324
|
+
const meta = options.metadataLookup(tool.name);
|
|
325
|
+
if (meta?.risk !== "safe")
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
const description = isB ? CLASS_B_SANITIZED[tool.name] : tool.description;
|
|
329
|
+
result.push({
|
|
330
|
+
name: tool.name,
|
|
331
|
+
description,
|
|
332
|
+
inputSchema: tool.inputSchema,
|
|
333
|
+
annotations: tool.annotations,
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
/** Returns the first forbidden keyword found in a string, or null. */
|
|
339
|
+
export function findForbiddenKeyword(text) {
|
|
340
|
+
const lower = text.toLowerCase();
|
|
341
|
+
for (const fragment of FORBIDDEN_KEYWORD_FRAGMENTS) {
|
|
342
|
+
if (lower.includes(fragment.toLowerCase()))
|
|
343
|
+
return fragment;
|
|
344
|
+
}
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
// Internal exports for test introspection only — consumers use
|
|
348
|
+
// filterToolsForPublicDiscovery + findForbiddenKeyword.
|
|
349
|
+
export const _internal = {
|
|
350
|
+
CLASS_A_ALLOWLIST,
|
|
351
|
+
CLASS_B_SANITIZED,
|
|
352
|
+
CLASS_C_EXCLUDE,
|
|
353
|
+
META_TOOL_EXCLUDE,
|
|
354
|
+
FORBIDDEN_KEYWORD_FRAGMENTS,
|
|
355
|
+
};
|
|
356
|
+
//# sourceMappingURL=public-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-filter.js","sourceRoot":"","sources":["../../src/tools/public-filter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Publishers Tools - MCP tools for querying and creating publisher records.
|
|
3
|
+
*
|
|
4
|
+
* ADR-174 Phase 2 item 22: `pica_publishers_create` is stdio-only (no
|
|
5
|
+
* mcp-server-business counterpart) so the schema lives inline rather than
|
|
6
|
+
* going through `@withpica/mcp-utils/write-schemas`. The route-layer
|
|
7
|
+
* allow-list at `lib/services/publishers-write-constants.ts` is the
|
|
8
|
+
* authoritative enforcement boundary; this schema is the agent-facing
|
|
9
|
+
* contract and surfaces the same shape so the tool advertises every
|
|
10
|
+
* writable column on `global_publishers`.
|
|
11
|
+
*
|
|
12
|
+
* Pre-slice the schema accepted `{ name, ipi }` and every other DB
|
|
13
|
+
* column was invisible to agents. Post-slice all 8 audit-row-22
|
|
14
|
+
* Add-candidates are exposed, and the `ipi → ipi_number` rename is
|
|
15
|
+
* explicit (the route returns a PHANTOM_FIELD error with a rename hint
|
|
16
|
+
* if `ipi` is still sent).
|
|
17
|
+
*/
|
|
18
|
+
import { PicaClient } from "@withpica/mcp-sdk";
|
|
19
|
+
import { ToolDefinition, ToolExecutor } from "./index.js";
|
|
20
|
+
export declare class PublishersTools {
|
|
21
|
+
private pica;
|
|
22
|
+
constructor(pica: PicaClient);
|
|
23
|
+
getTools(): Array<{
|
|
24
|
+
definition: ToolDefinition;
|
|
25
|
+
executor: ToolExecutor;
|
|
26
|
+
}>;
|
|
27
|
+
private queryPublishers;
|
|
28
|
+
private createPublisher;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=publishers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishers.d.ts","sourceRoot":"","sources":["../../src/tools/publishers.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAGtE,qBAAa,eAAe;IAC1B,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;YA0F3D,eAAe;YAaf,eAAe;CAQ9B"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
import { formatStructuredList, formatSuccess } from "@withpica/mcp-utils";
|
|
3
|
+
export class PublishersTools {
|
|
4
|
+
pica;
|
|
5
|
+
constructor(pica) {
|
|
6
|
+
this.pica = pica;
|
|
7
|
+
}
|
|
8
|
+
getTools() {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
definition: {
|
|
12
|
+
name: "pica_publishers_query",
|
|
13
|
+
description: "Find publishers by name or IPI. Use before setting publisher on credits. " +
|
|
14
|
+
"→ then: pica_credits_update (link publisher to a credit)",
|
|
15
|
+
workflows: "infrastructure",
|
|
16
|
+
inputSchema: {
|
|
17
|
+
type: "object",
|
|
18
|
+
properties: {
|
|
19
|
+
query: {
|
|
20
|
+
type: "string",
|
|
21
|
+
description: "Search by publisher name or IPI",
|
|
22
|
+
},
|
|
23
|
+
limit: {
|
|
24
|
+
type: "number",
|
|
25
|
+
description: "Max results (default: 50)",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
executor: this.queryPublishers.bind(this),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
definition: {
|
|
34
|
+
name: "pica_publishers_create",
|
|
35
|
+
description: "Create (or fetch existing) publisher in the catalog-wide " +
|
|
36
|
+
"`global_publishers` table. Idempotent by ipi_number — if a " +
|
|
37
|
+
"publisher with the same IPI already exists, returns the existing " +
|
|
38
|
+
"row. Check `pica_publishers_query` first to avoid duplicates and " +
|
|
39
|
+
"to resolve parent_publisher_id.",
|
|
40
|
+
workflows: "infrastructure",
|
|
41
|
+
inputSchema: {
|
|
42
|
+
type: "object",
|
|
43
|
+
properties: {
|
|
44
|
+
name: { type: "string", description: "Publisher name." },
|
|
45
|
+
ipi_number: {
|
|
46
|
+
type: "string",
|
|
47
|
+
description: "Publisher IPI number (9-11 digits; normalised to 11 with " +
|
|
48
|
+
"leading zero-padding). Required.",
|
|
49
|
+
},
|
|
50
|
+
legal_name: {
|
|
51
|
+
type: "string",
|
|
52
|
+
description: "Legal entity name (e.g. 'Example Publishing Ltd.') — optional.",
|
|
53
|
+
},
|
|
54
|
+
country: {
|
|
55
|
+
type: "string",
|
|
56
|
+
description: "ISO country code (e.g. 'GB', 'US').",
|
|
57
|
+
},
|
|
58
|
+
isni: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: "ISNI identifier (16-character alphanumeric) if the publisher has one.",
|
|
61
|
+
},
|
|
62
|
+
publisher_type: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Category label (e.g. 'major', 'indie', 'admin', 'self_published'). Freeform — no backend CHECK.",
|
|
65
|
+
},
|
|
66
|
+
wikidata_id: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "Wikidata Q-number (e.g. 'Q123456').",
|
|
69
|
+
},
|
|
70
|
+
parent_publisher_id: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "UUID of parent publisher for subsidiary/admin relationships. FK → global_publishers.id. Use `pica_publishers_query` to find the parent's ID before passing it here; the route returns FK_NOT_FOUND if the UUID does not exist.",
|
|
73
|
+
},
|
|
74
|
+
founded_date: {
|
|
75
|
+
type: "string",
|
|
76
|
+
description: "Founding date (YYYY-MM-DD).",
|
|
77
|
+
},
|
|
78
|
+
headquarters: {
|
|
79
|
+
type: "string",
|
|
80
|
+
description: "Freeform location (e.g. 'London, UK').",
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
required: ["name", "ipi_number"],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
executor: this.createPublisher.bind(this),
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
}
|
|
90
|
+
async queryPublishers(args) {
|
|
91
|
+
const result = await this.pica.publishers.list({
|
|
92
|
+
query: args.query,
|
|
93
|
+
limit: args.limit || 50,
|
|
94
|
+
});
|
|
95
|
+
const publishers = Array.isArray(result) ? result : result?.data || [];
|
|
96
|
+
return formatStructuredList(publishers, "publisher", {
|
|
97
|
+
total: publishers.length,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async createPublisher(args) {
|
|
101
|
+
const result = await this.pica.publishers.create(args);
|
|
102
|
+
return formatSuccess("Publisher created", result);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=publishers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishers.js","sourceRoot":"","sources":["../../src/tools/publishers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Purchases Tools — intentionally empty.
|
|
3
|
+
*
|
|
4
|
+
* `pica_credits_purchase` was removed from the MCP surface 2026-04-22 (see
|
|
5
|
+
* docs/MCP_REFINEMENT_LOG.md entry B-001). The underlying SDK method,
|
|
6
|
+
* `POST /api/admin/credits/purchase` route, and `createCreditPurchaseSession`
|
|
7
|
+
* were retired 2026-05-06 with the move to capacity-tier subscriptions
|
|
8
|
+
* (ADR-205). The Stripe webhook handler still recognises the legacy
|
|
9
|
+
* `credit_purchase` metadata to award credits if any stale checkout session
|
|
10
|
+
* completes; `creditsService.getPackageById` and `getPackages` are retained
|
|
11
|
+
* for that webhook path plus historical revenue reporting in
|
|
12
|
+
* `app/api/team/finances/overview/route.ts`. Do not delete those helpers
|
|
13
|
+
* even though the active surface looks dead.
|
|
14
|
+
*
|
|
15
|
+
* Kept as a class with an empty `getTools()` so tools/index.ts doesn't need
|
|
16
|
+
* to change imports or wiring — the class is a deliberate tombstone.
|
|
17
|
+
*/
|
|
18
|
+
import { PicaClient } from "@withpica/mcp-sdk";
|
|
19
|
+
import { ToolDefinition, ToolExecutor } from "./index.js";
|
|
20
|
+
export declare class PurchasesTools {
|
|
21
|
+
constructor(_pica: PicaClient);
|
|
22
|
+
getTools(): Array<{
|
|
23
|
+
definition: ToolDefinition;
|
|
24
|
+
executor: ToolExecutor;
|
|
25
|
+
}>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=purchases.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purchases.d.ts","sourceRoot":"","sources":["../../src/tools/purchases.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1D,qBAAa,cAAc;gBAEb,KAAK,EAAE,UAAU;IAE7B,QAAQ,IAAI,KAAK,CAAC;QAAE,UAAU,EAAE,cAAc,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC;CAG1E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purchases.js","sourceRoot":"","sources":["../../src/tools/purchases.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAuB7D,MAAM,OAAO,cAAc;IACzB,6DAA6D;IAC7D,YAAY,KAAiB,IAAG,CAAC;IAEjC,QAAQ;QACN,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ADR-213 Primitive A — completion hints for pica_recordings_create.
|
|
3
|
+
*
|
|
4
|
+
* Mirror of buildCustodyHints (works-side) for recordings. When a fresh
|
|
5
|
+
* recording is created, three Important-severity hints prompt the rights
|
|
6
|
+
* conversation by default:
|
|
7
|
+
*
|
|
8
|
+
* 1. recording_ownership_unset — fires when ownership_percentage IS NULL.
|
|
9
|
+
* NULL = "not set"; 0 = explicit zero (no hint, user has declared no
|
|
10
|
+
* ownership); 1-100 = already declared.
|
|
11
|
+
* 2. recording_no_credits — always fires (we never know credits from a
|
|
12
|
+
* single fresh row). Points at pica_recording_credits_update.
|
|
13
|
+
* 3. recording_master_unclaimed — fires when ownership_percentage IS NULL.
|
|
14
|
+
* Alternative path to #1 for orgs that want a formal chain claim
|
|
15
|
+
* (label / co-producer scenarios) rather than a flat percentage.
|
|
16
|
+
*
|
|
17
|
+
* Defensive shape — the SDK's `Recording` TS interface does not declare
|
|
18
|
+
* `ownership_percentage`, but the API returns it as JSON pass-through
|
|
19
|
+
* from `recordingsService.create`. Callers pass the raw recording object;
|
|
20
|
+
* we read fields with a typed wrapper.
|
|
21
|
+
*/
|
|
22
|
+
import type { CompletionHint } from "@withpica/mcp-utils";
|
|
23
|
+
export declare function buildRecordingAttributionHints(recording: unknown): CompletionHint[];
|
|
24
|
+
//# sourceMappingURL=recording-attribution-hints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-attribution-hints.d.ts","sourceRoot":"","sources":["../../src/tools/recording-attribution-hints.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAM1D,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,OAAO,GACjB,cAAc,EAAE,CAiClB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
export function buildRecordingAttributionHints(recording) {
|
|
3
|
+
const r = (recording ?? {});
|
|
4
|
+
const hints = [];
|
|
5
|
+
const ownershipUnset = r.ownership_percentage === null || r.ownership_percentage === undefined;
|
|
6
|
+
if (ownershipUnset) {
|
|
7
|
+
hints.push({
|
|
8
|
+
gap: "recording_ownership_unset",
|
|
9
|
+
severity: "important",
|
|
10
|
+
suggestion: "What % of this recording's master is owned by your org? Call pica_recordings_update with ownership_percentage:N (0-100). Skip if you hold no master stake.",
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
hints.push({
|
|
14
|
+
gap: "recording_no_credits",
|
|
15
|
+
severity: "important",
|
|
16
|
+
suggestion: "Who performed on this recording? Add performer / producer / engineer credits via pica_recording_credits_update — one call per credited person. Resolve names to person_id via pica_people_query first.",
|
|
17
|
+
});
|
|
18
|
+
if (ownershipUnset) {
|
|
19
|
+
hints.push({
|
|
20
|
+
gap: "recording_master_unclaimed",
|
|
21
|
+
severity: "important",
|
|
22
|
+
suggestion: "If the master is co-owned (label, co-producer, multi-party), claim a formal chain stake via pica_custody_claim with chain='master' instead of just setting ownership_percentage. Same outcome, richer attribution.",
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
return hints;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=recording-attribution-hints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording-attribution-hints.js","sourceRoot":"","sources":["../../src/tools/recording-attribution-hints.ts"],"names":[],"mappings":"AAAA,6DAA6D;AA8B7D,MAAM,UAAU,8BAA8B,CAC5C,SAAkB;IAElB,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAA6B,CAAC;IACxD,MAAM,KAAK,GAAqB,EAAE,CAAC;IAEnC,MAAM,cAAc,GAClB,CAAC,CAAC,oBAAoB,KAAK,IAAI,IAAI,CAAC,CAAC,oBAAoB,KAAK,SAAS,CAAC;IAE1E,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,2BAA2B;YAChC,QAAQ,EAAE,WAAW;YACrB,UAAU,EACR,4JAA4J;SAC/J,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC;QACT,GAAG,EAAE,sBAAsB;QAC3B,QAAQ,EAAE,WAAW;QACrB,UAAU,EACR,wMAAwM;KAC3M,CAAC,CAAC;IAEH,IAAI,cAAc,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC;YACT,GAAG,EAAE,4BAA4B;YACjC,QAAQ,EAAE,WAAW;YACrB,UAAU,EACR,oNAAoN;SACvN,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|