@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,144 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
import { formatAsText, formatSuccess, formatValidationError, } from "@withpica/mcp-utils";
|
|
3
|
+
export class TelegramTools {
|
|
4
|
+
pica;
|
|
5
|
+
constructor(pica) {
|
|
6
|
+
this.pica = pica;
|
|
7
|
+
}
|
|
8
|
+
getTools() {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
definition: {
|
|
12
|
+
name: "pica_telegram_status",
|
|
13
|
+
description: "Check if the user has Telegram connected. Use this before promising to send Telegram notifications. " +
|
|
14
|
+
"Returns connection status, username, and notification preferences. " +
|
|
15
|
+
"If not connected, suggest the user visit /connect to set up Telegram.",
|
|
16
|
+
workflows: "infrastructure",
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: "object",
|
|
19
|
+
properties: {},
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
executor: this.getStatus.bind(this),
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
definition: {
|
|
26
|
+
name: "pica_notify_user",
|
|
27
|
+
description: "Send a notification to the user's connected Telegram. Use for long-running tasks: " +
|
|
28
|
+
"enrichment, exports, duplicate merges, bulk operations. The message should be concise " +
|
|
29
|
+
"and actionable — tell them what finished and what to do next. " +
|
|
30
|
+
"Fails gracefully if Telegram is not connected (returns error, does not throw).",
|
|
31
|
+
workflows: "infrastructure",
|
|
32
|
+
inputSchema: {
|
|
33
|
+
type: "object",
|
|
34
|
+
properties: {
|
|
35
|
+
message: {
|
|
36
|
+
type: "string",
|
|
37
|
+
description: "Notification message (markdown supported). Keep it short — 1-3 sentences. " +
|
|
38
|
+
"Include what completed and any action needed.",
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
required: ["message"],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
executor: this.notifyUser.bind(this),
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
definition: {
|
|
48
|
+
name: "pica_telegram_connect",
|
|
49
|
+
description: "Pair the user's Telegram account with PICA so the agent can send " +
|
|
50
|
+
"notifications via pica_notify_user. Returns a short magic code the " +
|
|
51
|
+
"user sends to @withpica_bot, then call pica_telegram_status on the " +
|
|
52
|
+
"next turn to confirm the connection landed. If the user is already " +
|
|
53
|
+
"paired, short-circuits and returns { already_connected: true }. " +
|
|
54
|
+
"Idempotent — repeated calls within 10 minutes return the same code. " +
|
|
55
|
+
"Rate-limited to 3 new codes per user per rolling hour. " +
|
|
56
|
+
"Use when the user asks the agent to send them anything via Telegram " +
|
|
57
|
+
"but pica_telegram_status reports not connected.",
|
|
58
|
+
workflows: "infrastructure",
|
|
59
|
+
inputSchema: {
|
|
60
|
+
type: "object",
|
|
61
|
+
properties: {},
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
executor: this.connect.bind(this),
|
|
65
|
+
},
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
async getStatus(_args) {
|
|
69
|
+
const result = await this.pica.telegram.getStatus();
|
|
70
|
+
const data = result.data || result;
|
|
71
|
+
if (!data.connected) {
|
|
72
|
+
return formatAsText({
|
|
73
|
+
connected: false,
|
|
74
|
+
message: "Telegram is not connected. The user can set it up at /connect.",
|
|
75
|
+
bot_username: data.botUsername,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return formatSuccess(`Telegram connected as @${data.telegramUsername || data.telegramFirstName}. You can send notifications via pica_notify_user.`, {
|
|
79
|
+
connected: true,
|
|
80
|
+
telegram_username: data.telegramUsername,
|
|
81
|
+
telegram_first_name: data.telegramFirstName,
|
|
82
|
+
preferences: data.preferences,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
async notifyUser(args) {
|
|
86
|
+
if (!args.message?.trim()) {
|
|
87
|
+
return formatValidationError({ message: "message is required" });
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const result = await this.pica.telegram.sendNotification(args.message.trim());
|
|
91
|
+
const data = result.data || result;
|
|
92
|
+
return formatSuccess(`Notification sent to @${data.telegramUsername || "user"} on Telegram.`, { sent: true, telegram_username: data.telegramUsername });
|
|
93
|
+
}
|
|
94
|
+
catch (err) {
|
|
95
|
+
// Graceful failure — don't throw, return error text
|
|
96
|
+
const message = err?.message || String(err);
|
|
97
|
+
if (message.includes("not connected") || message.includes("400")) {
|
|
98
|
+
return formatAsText({
|
|
99
|
+
sent: false,
|
|
100
|
+
error: "Telegram is not connected. The user can set it up at /connect.",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return formatAsText({
|
|
104
|
+
sent: false,
|
|
105
|
+
error: `Failed to send notification: ${message}`,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async connect(_args) {
|
|
110
|
+
try {
|
|
111
|
+
const result = await this.pica.telegram.connect();
|
|
112
|
+
const data = result.data || result;
|
|
113
|
+
if (data.already_connected) {
|
|
114
|
+
return formatSuccess(`Telegram is already paired as @${data.telegram_username || "user"}. You can send notifications via pica_notify_user.`, {
|
|
115
|
+
already_connected: true,
|
|
116
|
+
telegram_username: data.telegram_username,
|
|
117
|
+
telegram_first_name: data.telegram_first_name,
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
return formatSuccess(data.instructions ||
|
|
121
|
+
`Open ${data.bot_url} and send the code ${data.code}. Call pica_telegram_status on the next turn to confirm.`, {
|
|
122
|
+
already_connected: false,
|
|
123
|
+
code: data.code,
|
|
124
|
+
bot_url: data.bot_url,
|
|
125
|
+
expires_at: data.expires_at,
|
|
126
|
+
instructions: data.instructions,
|
|
127
|
+
completion_hints: data.completion_hints,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch (err) {
|
|
131
|
+
const message = err?.message || String(err);
|
|
132
|
+
if (message.includes("rate_limited") || message.includes("429")) {
|
|
133
|
+
return formatAsText({
|
|
134
|
+
error: "rate_limited",
|
|
135
|
+
message: "Too many Telegram pairing attempts. Try again in an hour.",
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
return formatAsText({
|
|
139
|
+
error: `Failed to generate pairing code: ${message}`,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=telegram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/tools/telegram.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upload Tools - MCP tools for uploading any file type (images, videos, documents)
|
|
3
|
+
* Uses the generic storage presigned upload route that supports all PICA storage providers.
|
|
4
|
+
*/
|
|
5
|
+
import { PicaClient } from "@withpica/mcp-sdk";
|
|
6
|
+
import { ToolDefinition, ToolExecutor } from "./index.js";
|
|
7
|
+
export declare class UploadTools {
|
|
8
|
+
private pica;
|
|
9
|
+
constructor(pica: PicaClient);
|
|
10
|
+
getTools(): Array<{
|
|
11
|
+
definition: ToolDefinition;
|
|
12
|
+
executor: ToolExecutor;
|
|
13
|
+
}>;
|
|
14
|
+
private presignedUpload;
|
|
15
|
+
private completeUpload;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=uploads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.d.ts","sourceRoot":"","sources":["../../src/tools/uploads.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAGtE,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;YA+H3D,eAAe;YA0Bf,cAAc;CAwB7B"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
import { formatSuccess } from "@withpica/mcp-utils";
|
|
3
|
+
export class UploadTools {
|
|
4
|
+
pica;
|
|
5
|
+
constructor(pica) {
|
|
6
|
+
this.pica = pica;
|
|
7
|
+
}
|
|
8
|
+
getTools() {
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
definition: {
|
|
12
|
+
name: "pica_upload_file",
|
|
13
|
+
description: "Generate a signed URL for uploading ANY file type — images, videos, documents, or audio. " +
|
|
14
|
+
"The storage category is auto-detected from the MIME type. After uploading the file via HTTP PUT " +
|
|
15
|
+
"to the returned URL, call pica_upload_complete to finalize. " +
|
|
16
|
+
"Supported: images (JPEG, PNG, GIF, WebP, HEIC, AVIF, TIFF), " +
|
|
17
|
+
"videos (MP4, QuickTime, WebM, MKV), " +
|
|
18
|
+
"documents (PDF, Word, Excel), " +
|
|
19
|
+
"audio (WAV, MP3, FLAC, AIFF, OGG, WebM). " +
|
|
20
|
+
"For audio files that need BPM/key analysis, use pica_audio_presigned_upload instead. " +
|
|
21
|
+
"TIP: if you are in ChatGPT or another external client, users cannot upload files " +
|
|
22
|
+
"through the chat. Direct them to https://withpica.com/workspace where they can " +
|
|
23
|
+
"drag and drop files, then offer to help link or organise them afterwards.",
|
|
24
|
+
workflows: "infrastructure",
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: "object",
|
|
27
|
+
properties: {
|
|
28
|
+
filename: {
|
|
29
|
+
type: "string",
|
|
30
|
+
description: "Original filename with extension (e.g. 'promo-photo.jpg', 'contract.pdf')",
|
|
31
|
+
},
|
|
32
|
+
content_type: {
|
|
33
|
+
type: "string",
|
|
34
|
+
description: "MIME type — detect from the filename extension (e.g. .jpg→image/jpeg, " +
|
|
35
|
+
".png→image/png, .mp4→video/mp4, .pdf→application/pdf, " +
|
|
36
|
+
".wav→audio/wav, .mp3→audio/mpeg). Do not ask the user for this.",
|
|
37
|
+
},
|
|
38
|
+
file_size: {
|
|
39
|
+
type: "number",
|
|
40
|
+
description: "File size in bytes",
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
required: ["filename", "content_type", "file_size"],
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
executor: this.presignedUpload.bind(this),
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
definition: {
|
|
50
|
+
name: "pica_upload_complete",
|
|
51
|
+
description: "Finalize a file upload after the file has been PUT to the signed URL from pica_upload_file. " +
|
|
52
|
+
"Creates the appropriate database record (multimedia item for images/video, document for PDFs, " +
|
|
53
|
+
"audio file for audio). Use the uploadId, key, bucket, and storageCategory from pica_upload_file.",
|
|
54
|
+
workflows: "infrastructure",
|
|
55
|
+
inputSchema: {
|
|
56
|
+
type: "object",
|
|
57
|
+
properties: {
|
|
58
|
+
upload_id: {
|
|
59
|
+
type: "string",
|
|
60
|
+
description: "The uploadId returned from pica_upload_file",
|
|
61
|
+
},
|
|
62
|
+
key: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "The storage key returned from pica_upload_file",
|
|
65
|
+
},
|
|
66
|
+
bucket: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "The bucket returned from pica_upload_file",
|
|
69
|
+
},
|
|
70
|
+
storage_category: {
|
|
71
|
+
type: "string",
|
|
72
|
+
description: "The storageCategory returned from pica_upload_file",
|
|
73
|
+
enum: ["audio", "media", "documents"],
|
|
74
|
+
},
|
|
75
|
+
filename: {
|
|
76
|
+
type: "string",
|
|
77
|
+
description: "Original filename",
|
|
78
|
+
},
|
|
79
|
+
content_type: {
|
|
80
|
+
type: "string",
|
|
81
|
+
description: "MIME type of the uploaded file",
|
|
82
|
+
},
|
|
83
|
+
file_size: {
|
|
84
|
+
type: "number",
|
|
85
|
+
description: "File size in bytes",
|
|
86
|
+
},
|
|
87
|
+
title: {
|
|
88
|
+
type: "string",
|
|
89
|
+
description: "Optional title. Defaults to filename without extension.",
|
|
90
|
+
},
|
|
91
|
+
work_id: {
|
|
92
|
+
type: "string",
|
|
93
|
+
description: "Optional work ID to link the file to (audio only). For images/videos, use pica_multimedia_link_work after upload.",
|
|
94
|
+
},
|
|
95
|
+
classification: {
|
|
96
|
+
type: "string",
|
|
97
|
+
description: "For media: classification type (e.g. 'press_photo', 'album_artwork', 'music_video'). " +
|
|
98
|
+
"For documents: category (e.g. 'agreement', 'statement', 'other').",
|
|
99
|
+
},
|
|
100
|
+
linked_to_type: {
|
|
101
|
+
type: "string",
|
|
102
|
+
description: "For documents: entity type to link to (e.g. 'work', 'person', 'agreement')",
|
|
103
|
+
},
|
|
104
|
+
linked_to_id: {
|
|
105
|
+
type: "string",
|
|
106
|
+
description: "For documents: entity ID to link to",
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
required: [
|
|
110
|
+
"upload_id",
|
|
111
|
+
"key",
|
|
112
|
+
"bucket",
|
|
113
|
+
"storage_category",
|
|
114
|
+
"filename",
|
|
115
|
+
"content_type",
|
|
116
|
+
"file_size",
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
executor: this.completeUpload.bind(this),
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- matches ToolExecutor signature
|
|
125
|
+
async presignedUpload(args) {
|
|
126
|
+
const result = await this.pica.storage.presignedUpload({
|
|
127
|
+
filename: args.filename,
|
|
128
|
+
contentType: args.content_type,
|
|
129
|
+
fileSize: args.file_size,
|
|
130
|
+
});
|
|
131
|
+
return formatSuccess(`Upload URL generated for "${args.filename}" (category: ${result.storageCategory}). ` +
|
|
132
|
+
`PUT the file to the uploadUrl, then call pica_upload_complete with uploadId, key, bucket, ` +
|
|
133
|
+
`storageCategory, and metadata to finalize.`, {
|
|
134
|
+
uploadUrl: result.uploadUrl,
|
|
135
|
+
uploadId: result.uploadId,
|
|
136
|
+
key: result.key,
|
|
137
|
+
bucket: result.bucket,
|
|
138
|
+
storageCategory: result.storageCategory,
|
|
139
|
+
expiresAt: result.expiresAt,
|
|
140
|
+
metadata: result.metadata,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- matches ToolExecutor signature
|
|
144
|
+
async completeUpload(args) {
|
|
145
|
+
const result = await this.pica.storage.completeUpload({
|
|
146
|
+
uploadId: args.upload_id,
|
|
147
|
+
key: args.key,
|
|
148
|
+
bucket: args.bucket,
|
|
149
|
+
metadata: {
|
|
150
|
+
filename: args.filename,
|
|
151
|
+
contentType: args.content_type,
|
|
152
|
+
fileSize: args.file_size,
|
|
153
|
+
storageCategory: args.storage_category,
|
|
154
|
+
title: args.title,
|
|
155
|
+
workId: args.work_id,
|
|
156
|
+
classification: args.classification,
|
|
157
|
+
documentCategory: args.classification,
|
|
158
|
+
linkedToType: args.linked_to_type,
|
|
159
|
+
linkedToId: args.linked_to_id,
|
|
160
|
+
},
|
|
161
|
+
});
|
|
162
|
+
return formatSuccess(`Upload finalized. Created ${result.recordType} record with ID: ${result.recordId}.`, result);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=uploads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uploads.js","sourceRoot":"","sources":["../../src/tools/uploads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Works Tools — MCP tools for managing musical works.
|
|
3
|
+
*
|
|
4
|
+
* ADR-174 Phase 2 item 2 reconciliation: the write surface covers only
|
|
5
|
+
* real columns on `public.works`. Seven phantom fields previously
|
|
6
|
+
* accepted via `additionalProperties: true` have been removed:
|
|
7
|
+
* - `label` (no column; recordings/releases store label via org FK)
|
|
8
|
+
* - `spotify_url` (lives on recordings/releases)
|
|
9
|
+
* - `album_name`, `album_release_date`, `album_art_url`, `track_number`,
|
|
10
|
+
* `upc` (all album/release metadata — handled via `pica_releases_*`)
|
|
11
|
+
*
|
|
12
|
+
* Five add-candidates surfaced per the audit at
|
|
13
|
+
* docs/audits/2026-04-14-mcp-db-reconciliation.md §1:
|
|
14
|
+
* tempo, key, display_artist, published, tunecode.
|
|
15
|
+
*
|
|
16
|
+
* Agents that need to set label metadata call `pica_releases_create`
|
|
17
|
+
* or `pica_releases_update` with `label_organization_id`, resolving
|
|
18
|
+
* the name via `pica_labels_query` first.
|
|
19
|
+
*/
|
|
20
|
+
import { PicaClient } from "@withpica/mcp-sdk";
|
|
21
|
+
import { ToolDefinition, ToolExecutor } from "./index.js";
|
|
22
|
+
/**
|
|
23
|
+
* Canonical write-schema for `works`. Every property below must
|
|
24
|
+
* correspond to a real column on `public.works` — verified against
|
|
25
|
+
* `lib/db/database.types.ts`. Keep this list tight: reintroducing a
|
|
26
|
+
* phantom field is the exact regression ADR-174 Phase 2 exists to
|
|
27
|
+
* prevent. The HTTP route at `app/api/admin/works/[id]/route.ts`
|
|
28
|
+
* carries a broader allow-list that includes admin-UI-posted satellite
|
|
29
|
+
* fields; this list is the narrower MCP-agent contract.
|
|
30
|
+
*/
|
|
31
|
+
export declare const WORK_WRITE_PROPERTIES: Record<string, Record<string, unknown>>;
|
|
32
|
+
export declare class WorksTools {
|
|
33
|
+
private pica;
|
|
34
|
+
constructor(pica: PicaClient);
|
|
35
|
+
/**
|
|
36
|
+
* Get all works tools
|
|
37
|
+
*/
|
|
38
|
+
getTools(): Array<{
|
|
39
|
+
definition: ToolDefinition;
|
|
40
|
+
executor: ToolExecutor;
|
|
41
|
+
}>;
|
|
42
|
+
/**
|
|
43
|
+
* Query works — unified search, list, and health filter
|
|
44
|
+
*/
|
|
45
|
+
private queryWorks;
|
|
46
|
+
/**
|
|
47
|
+
* Inspect work — unified detail view with selectable sections
|
|
48
|
+
*/
|
|
49
|
+
private inspectWork;
|
|
50
|
+
/**
|
|
51
|
+
* Create work
|
|
52
|
+
*/
|
|
53
|
+
private createWork;
|
|
54
|
+
/**
|
|
55
|
+
* Update work
|
|
56
|
+
*/
|
|
57
|
+
private updateWork;
|
|
58
|
+
/**
|
|
59
|
+
* Delete work
|
|
60
|
+
*/
|
|
61
|
+
private deleteWork;
|
|
62
|
+
/**
|
|
63
|
+
* Verify work
|
|
64
|
+
*/
|
|
65
|
+
private verifyWork;
|
|
66
|
+
/**
|
|
67
|
+
* Bulk delete works
|
|
68
|
+
*/
|
|
69
|
+
private bulkDeleteWorks;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=works.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"works.d.ts","sourceRoot":"","sources":["../../src/tools/works.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAatE;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkHzE,CAAC;AAEF,qBAAa,UAAU;IACrB,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;IA8PzE;;OAEG;YACW,UAAU;IAsDxB;;OAEG;YACW,WAAW;IAwPzB;;OAEG;YACW,UAAU;IAkCxB;;OAEG;YACW,UAAU;IAMxB;;OAEG;YACW,UAAU;IAKxB;;OAEG;YACW,UAAU;IAiDxB;;OAEG;YACW,eAAe;CAM9B"}
|