@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 @@
|
|
|
1
|
+
{"version":3,"file":"welcome.js","sourceRoot":"","sources":["../../src/resources/welcome.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAC3B,uBAAuB;IACvB,yFAAyF;IACzF,oBAAoB;IACpB,uDAAuD;IACvD,iFAAiF;IACjF,oDAAoD;IACpD,yCAAyC;IACzC,mDAAmD;IACnD,8DAA8D;IAC9D,8CAA8C;IAC9C,iCAAiC;IACjC,gDAAgD,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-level instructions sent to agents on MCP handshake.
|
|
3
|
+
* Keep under 2000 chars — this is context budget, not documentation.
|
|
4
|
+
*
|
|
5
|
+
* Two variants per ADR-211 Phase 1 Primitive C:
|
|
6
|
+
* - SERVER_INSTRUCTIONS / SERVER_INSTRUCTIONS_AUTHENTICATED: full surface
|
|
7
|
+
* guidance. Selected when the binary has a connection key (PICA_API_KEY).
|
|
8
|
+
* - SERVER_INSTRUCTIONS_UNAUTHENTICATED: short lobby guidance pointing the
|
|
9
|
+
* agent at pica_signup_start (or pica_sign_in for existing users).
|
|
10
|
+
* Selected when the binary boots without PICA_API_KEY. The lobby
|
|
11
|
+
* surface is the 3 tools {pica_signup_start, pica_sign_in,
|
|
12
|
+
* pica_sign_out} — none of the catalog tools are reachable, so we
|
|
13
|
+
* skip the catalog-tool guidance.
|
|
14
|
+
*
|
|
15
|
+
* Block playbook: "document the high level of your server"
|
|
16
|
+
* Lowin: "instructions are context — design them as context"
|
|
17
|
+
*/
|
|
18
|
+
export declare const SERVER_INSTRUCTIONS = "withPICA manages music catalog metadata \u2014 works, recordings, people, credits, agreements, rights. Tools are pica_<domain>_<verb>, 200+ of them, from npm as @withpica/mcp-server. If you see pica_execute, Execute Pica Action, or Search Platform Actions \u2014 that's @picahq/mcp (picaos.com), a different product with the same short name; don't route withPICA work there.\n\nStart here:\n- pica_dashboard_briefing \u2014 daily summary of what needs attention\n- pica_search_all \u2014 find any entity by name, ISWC, ISRC, or IPI\n- pica_works_query / pica_people_query \u2014 browse the catalog\n\nThe catalog is ALWAYS accessible via the tools above \u2014 zero setup, no integration required. If pica_integrations_status shows \"0 connected\" that refers to optional peer connectors (Google/Notion/Airtable/Telegram), NOT the catalog; call pica_works_query to check what's there.\n\nSpotify/YouTube URLs: call pica_import_streaming_link (Spotify/Deezer) or pica_import_youtube_link directly.\n\nAfter 3-5 catalog mutations or major state changes, call pica_dashboard_briefing and surface the delta to the user.\n\nKey patterns:\n- Read tools are safe to call freely (readOnlyHint=true)\n- _inspect tools take sections (e.g., pica_works_inspect sections: [\"health\", \"completeness\"])\n- Write tools confirm what changed; destructive tools (delete/merge) need two-step confirmation with a token\n- Errors include \"suggestion\" and \"next_tool\" for recovery\n- Enrichment: use pica_resolve_work / pica_resolve_person / pica_resolve_recording \u2014 fan out over Spotify, MusicBrainz, MLC, ISNI, Discogs, YouTube\n\nQuery endpoints accept \"limit\" (default 50) and paginate. IDs are UUIDs \u2014 use a _query tool first when unsure.\n\nPeer connectors (email, drive, notes, calendar, DAW MCPs): when PICA shows missing data, check peer MCPs before asking the user. Cite via pica_enrichment_propose sources[].url with URI schemes \u2014 gmail:// gdrive:// notion:// file:// telegram:// calendar:// daw:// user:// web://. See docs/mcp-source-uri-conventions.md.";
|
|
19
|
+
/** Alias for the authenticated default — names the variant explicitly when paired with the unauthenticated one. */
|
|
20
|
+
export declare const SERVER_INSTRUCTIONS_AUTHENTICATED = "withPICA manages music catalog metadata \u2014 works, recordings, people, credits, agreements, rights. Tools are pica_<domain>_<verb>, 200+ of them, from npm as @withpica/mcp-server. If you see pica_execute, Execute Pica Action, or Search Platform Actions \u2014 that's @picahq/mcp (picaos.com), a different product with the same short name; don't route withPICA work there.\n\nStart here:\n- pica_dashboard_briefing \u2014 daily summary of what needs attention\n- pica_search_all \u2014 find any entity by name, ISWC, ISRC, or IPI\n- pica_works_query / pica_people_query \u2014 browse the catalog\n\nThe catalog is ALWAYS accessible via the tools above \u2014 zero setup, no integration required. If pica_integrations_status shows \"0 connected\" that refers to optional peer connectors (Google/Notion/Airtable/Telegram), NOT the catalog; call pica_works_query to check what's there.\n\nSpotify/YouTube URLs: call pica_import_streaming_link (Spotify/Deezer) or pica_import_youtube_link directly.\n\nAfter 3-5 catalog mutations or major state changes, call pica_dashboard_briefing and surface the delta to the user.\n\nKey patterns:\n- Read tools are safe to call freely (readOnlyHint=true)\n- _inspect tools take sections (e.g., pica_works_inspect sections: [\"health\", \"completeness\"])\n- Write tools confirm what changed; destructive tools (delete/merge) need two-step confirmation with a token\n- Errors include \"suggestion\" and \"next_tool\" for recovery\n- Enrichment: use pica_resolve_work / pica_resolve_person / pica_resolve_recording \u2014 fan out over Spotify, MusicBrainz, MLC, ISNI, Discogs, YouTube\n\nQuery endpoints accept \"limit\" (default 50) and paginate. IDs are UUIDs \u2014 use a _query tool first when unsure.\n\nPeer connectors (email, drive, notes, calendar, DAW MCPs): when PICA shows missing data, check peer MCPs before asking the user. Cite via pica_enrichment_propose sources[].url with URI schemes \u2014 gmail:// gdrive:// notion:// file:// telegram:// calendar:// daw:// user:// web://. See docs/mcp-source-uri-conventions.md.";
|
|
21
|
+
/** Minimal billing-slice shape consumed by the trial-ending clause. Structurally
|
|
22
|
+
* compatible with `OrgBillingSlice` from lib/services/subscription so callers
|
|
23
|
+
* can pass either. Local declaration keeps mcp-server's copy self-contained
|
|
24
|
+
* (the mcp-server npm artefact cannot import from @/lib paths). */
|
|
25
|
+
export interface TrialNudgeSlice {
|
|
26
|
+
billing_state: string;
|
|
27
|
+
trial_days_remaining: number | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Returns the authenticated handshake instructions, optionally appended with a
|
|
31
|
+
* state-conditional trial-ending nudge (ADR-210 Phase 3 / coordinator D3).
|
|
32
|
+
*
|
|
33
|
+
* Pass `null` when slice is unavailable (stdio binary at boot, or any path
|
|
34
|
+
* where the org context isn't resolvable); the function returns the base
|
|
35
|
+
* const unchanged in that case. Slice-less callers fail safe.
|
|
36
|
+
*
|
|
37
|
+
* Trial nudge fires only when `billing_state === 'trial'` AND
|
|
38
|
+
* `trial_days_remaining <= 3` AND remaining is not null. All other states
|
|
39
|
+
* (active / hibernated / paused / unclassified) and longer windows return
|
|
40
|
+
* the empty clause.
|
|
41
|
+
*/
|
|
42
|
+
export declare function getAuthenticatedInstructions(slice: TrialNudgeSlice | null): string;
|
|
43
|
+
export declare function getTrialEndingClause(slice: TrialNudgeSlice | null): string;
|
|
44
|
+
/**
|
|
45
|
+
* Lobby instructions sent on handshake when the server has no connection key
|
|
46
|
+
* (stdio without PICA_API_KEY) or no Bearer token (HTTP /api/mcp anonymous mode).
|
|
47
|
+
*
|
|
48
|
+
* Lobby tool surface is exactly three tools:
|
|
49
|
+
* - pica_signup_start — for new users (mints a 15-min JWT-bound /onboard URL)
|
|
50
|
+
* - pica_sign_in — for existing users (sends a magic link)
|
|
51
|
+
* - pica_sign_out — for clearing stale credentials
|
|
52
|
+
*
|
|
53
|
+
* Authority: ADR-211 Phase 1 § Primitive C. Catalog-tool guidance omitted
|
|
54
|
+
* because none of the catalog tools are reachable in lobby mode.
|
|
55
|
+
*
|
|
56
|
+
* Kept byte-for-byte identical to lib/mcp/server-instructions.ts —
|
|
57
|
+
* `__tests__/mcp-server-instructions-unauth-parity.test.ts` enforces.
|
|
58
|
+
*/
|
|
59
|
+
export declare const SERVER_INSTRUCTIONS_UNAUTHENTICATED = "You are connected to withPICA but no user is authenticated yet. Three tools are available:\n\n- pica_signup_start \u2014 for users new to withPICA. Ask for the user's email, then call this tool. It returns a single-use 15-minute signup link the user clicks to verify email, name their catalog, and start a 14-day free trial.\n- pica_sign_in \u2014 for users who already have a withPICA account. Sends a magic link to their inbox (device-code flow on stdio).\n- pica_sign_out \u2014 clears saved credentials.\n\nDo not promise catalog data, exports, or analyses until the user is signed in \u2014 none of those tools are reachable from this lobby. After signup or sign-in, the connection's tool surface refreshes automatically; ask the user what they want to do next.";
|
|
60
|
+
//# sourceMappingURL=server-instructions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-instructions.d.ts","sourceRoot":"","sources":["../src/server-instructions.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,mBAAmB,uhEAsB+R,CAAC;AAEhU,mHAAmH;AACnH,eAAO,MAAM,iCAAiC,uhEAAsB,CAAC;AAErE;;;oEAGoE;AACpE,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,eAAe,GAAG,IAAI,GAC5B,MAAM,CAER;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,GAAG,MAAM,CAO1E;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mCAAmC,mwBAM2M,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
/**
|
|
3
|
+
* Server-level instructions sent to agents on MCP handshake.
|
|
4
|
+
* Keep under 2000 chars — this is context budget, not documentation.
|
|
5
|
+
*
|
|
6
|
+
* Two variants per ADR-211 Phase 1 Primitive C:
|
|
7
|
+
* - SERVER_INSTRUCTIONS / SERVER_INSTRUCTIONS_AUTHENTICATED: full surface
|
|
8
|
+
* guidance. Selected when the binary has a connection key (PICA_API_KEY).
|
|
9
|
+
* - SERVER_INSTRUCTIONS_UNAUTHENTICATED: short lobby guidance pointing the
|
|
10
|
+
* agent at pica_signup_start (or pica_sign_in for existing users).
|
|
11
|
+
* Selected when the binary boots without PICA_API_KEY. The lobby
|
|
12
|
+
* surface is the 3 tools {pica_signup_start, pica_sign_in,
|
|
13
|
+
* pica_sign_out} — none of the catalog tools are reachable, so we
|
|
14
|
+
* skip the catalog-tool guidance.
|
|
15
|
+
*
|
|
16
|
+
* Block playbook: "document the high level of your server"
|
|
17
|
+
* Lowin: "instructions are context — design them as context"
|
|
18
|
+
*/
|
|
19
|
+
export const SERVER_INSTRUCTIONS = `withPICA manages music catalog metadata — works, recordings, people, credits, agreements, rights. Tools are pica_<domain>_<verb>, 200+ of them, from npm as @withpica/mcp-server. If you see pica_execute, Execute Pica Action, or Search Platform Actions — that's @picahq/mcp (picaos.com), a different product with the same short name; don't route withPICA work there.
|
|
20
|
+
|
|
21
|
+
Start here:
|
|
22
|
+
- pica_dashboard_briefing — daily summary of what needs attention
|
|
23
|
+
- pica_search_all — find any entity by name, ISWC, ISRC, or IPI
|
|
24
|
+
- pica_works_query / pica_people_query — browse the catalog
|
|
25
|
+
|
|
26
|
+
The catalog is ALWAYS accessible via the tools above — zero setup, no integration required. If pica_integrations_status shows "0 connected" that refers to optional peer connectors (Google/Notion/Airtable/Telegram), NOT the catalog; call pica_works_query to check what's there.
|
|
27
|
+
|
|
28
|
+
Spotify/YouTube URLs: call pica_import_streaming_link (Spotify/Deezer) or pica_import_youtube_link directly.
|
|
29
|
+
|
|
30
|
+
After 3-5 catalog mutations or major state changes, call pica_dashboard_briefing and surface the delta to the user.
|
|
31
|
+
|
|
32
|
+
Key patterns:
|
|
33
|
+
- Read tools are safe to call freely (readOnlyHint=true)
|
|
34
|
+
- _inspect tools take sections (e.g., pica_works_inspect sections: ["health", "completeness"])
|
|
35
|
+
- Write tools confirm what changed; destructive tools (delete/merge) need two-step confirmation with a token
|
|
36
|
+
- Errors include "suggestion" and "next_tool" for recovery
|
|
37
|
+
- Enrichment: use pica_resolve_work / pica_resolve_person / pica_resolve_recording — fan out over Spotify, MusicBrainz, MLC, ISNI, Discogs, YouTube
|
|
38
|
+
|
|
39
|
+
Query endpoints accept "limit" (default 50) and paginate. IDs are UUIDs — use a _query tool first when unsure.
|
|
40
|
+
|
|
41
|
+
Peer connectors (email, drive, notes, calendar, DAW MCPs): when PICA shows missing data, check peer MCPs before asking the user. Cite via pica_enrichment_propose sources[].url with URI schemes — gmail:// gdrive:// notion:// file:// telegram:// calendar:// daw:// user:// web://. See docs/mcp-source-uri-conventions.md.`;
|
|
42
|
+
/** Alias for the authenticated default — names the variant explicitly when paired with the unauthenticated one. */
|
|
43
|
+
export const SERVER_INSTRUCTIONS_AUTHENTICATED = SERVER_INSTRUCTIONS;
|
|
44
|
+
/**
|
|
45
|
+
* Returns the authenticated handshake instructions, optionally appended with a
|
|
46
|
+
* state-conditional trial-ending nudge (ADR-210 Phase 3 / coordinator D3).
|
|
47
|
+
*
|
|
48
|
+
* Pass `null` when slice is unavailable (stdio binary at boot, or any path
|
|
49
|
+
* where the org context isn't resolvable); the function returns the base
|
|
50
|
+
* const unchanged in that case. Slice-less callers fail safe.
|
|
51
|
+
*
|
|
52
|
+
* Trial nudge fires only when `billing_state === 'trial'` AND
|
|
53
|
+
* `trial_days_remaining <= 3` AND remaining is not null. All other states
|
|
54
|
+
* (active / hibernated / paused / unclassified) and longer windows return
|
|
55
|
+
* the empty clause.
|
|
56
|
+
*/
|
|
57
|
+
export function getAuthenticatedInstructions(slice) {
|
|
58
|
+
return SERVER_INSTRUCTIONS_AUTHENTICATED + getTrialEndingClause(slice);
|
|
59
|
+
}
|
|
60
|
+
export function getTrialEndingClause(slice) {
|
|
61
|
+
if (!slice)
|
|
62
|
+
return "";
|
|
63
|
+
if (slice.billing_state !== "trial")
|
|
64
|
+
return "";
|
|
65
|
+
const days = slice.trial_days_remaining;
|
|
66
|
+
if (days === null || days > 3)
|
|
67
|
+
return "";
|
|
68
|
+
const dayWord = days === 1 ? "day" : "days";
|
|
69
|
+
return `\n\nThe user's trial ends in ${days} ${dayWord}. If they ask about pricing, plans, or upgrading, call pica_subscription_manage to mint a checkout URL.`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Lobby instructions sent on handshake when the server has no connection key
|
|
73
|
+
* (stdio without PICA_API_KEY) or no Bearer token (HTTP /api/mcp anonymous mode).
|
|
74
|
+
*
|
|
75
|
+
* Lobby tool surface is exactly three tools:
|
|
76
|
+
* - pica_signup_start — for new users (mints a 15-min JWT-bound /onboard URL)
|
|
77
|
+
* - pica_sign_in — for existing users (sends a magic link)
|
|
78
|
+
* - pica_sign_out — for clearing stale credentials
|
|
79
|
+
*
|
|
80
|
+
* Authority: ADR-211 Phase 1 § Primitive C. Catalog-tool guidance omitted
|
|
81
|
+
* because none of the catalog tools are reachable in lobby mode.
|
|
82
|
+
*
|
|
83
|
+
* Kept byte-for-byte identical to lib/mcp/server-instructions.ts —
|
|
84
|
+
* `__tests__/mcp-server-instructions-unauth-parity.test.ts` enforces.
|
|
85
|
+
*/
|
|
86
|
+
export const SERVER_INSTRUCTIONS_UNAUTHENTICATED = `You are connected to withPICA but no user is authenticated yet. Three tools are available:
|
|
87
|
+
|
|
88
|
+
- pica_signup_start — for users new to withPICA. Ask for the user's email, then call this tool. It returns a single-use 15-minute signup link the user clicks to verify email, name their catalog, and start a 14-day free trial.
|
|
89
|
+
- pica_sign_in — for users who already have a withPICA account. Sends a magic link to their inbox (device-code flow on stdio).
|
|
90
|
+
- pica_sign_out — clears saved credentials.
|
|
91
|
+
|
|
92
|
+
Do not promise catalog data, exports, or analyses until the user is signed in — none of those tools are reachable from this lobby. After signup or sign-in, the connection's tool surface refreshes automatically; ask the user what they want to do next.`;
|
|
93
|
+
//# sourceMappingURL=server-instructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-instructions.js","sourceRoot":"","sources":["../src/server-instructions.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;+TAsB4R,CAAC;AAEhU,mHAAmH;AACnH,MAAM,CAAC,MAAM,iCAAiC,GAAG,mBAAmB,CAAC;AAWrE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAA6B;IAE7B,OAAO,iCAAiC,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAA6B;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,IAAI,KAAK,CAAC,aAAa,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,oBAAoB,CAAC;IACxC,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,gCAAgC,IAAI,IAAI,OAAO,yGAAyG,CAAC;AAClK,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG;;;;;;2PAMwM,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ServerConfig } from "./config.js";
|
|
2
|
+
export declare class PicaMcpServer {
|
|
3
|
+
private server;
|
|
4
|
+
private pica;
|
|
5
|
+
private toolRegistry;
|
|
6
|
+
private resourceRegistry;
|
|
7
|
+
private promptRegistry;
|
|
8
|
+
private config;
|
|
9
|
+
private httpServer?;
|
|
10
|
+
constructor(config: ServerConfig);
|
|
11
|
+
/**
|
|
12
|
+
* Reinitialize server with new credentials (called after successful auth)
|
|
13
|
+
*/
|
|
14
|
+
reinitialize(apiKey: string): void;
|
|
15
|
+
/**
|
|
16
|
+
* Reset the server back to lobby mode (called after sign_out).
|
|
17
|
+
* Mirrors reinitialize() but in reverse: clears the PicaClient,
|
|
18
|
+
* sets lobbyMode=true, and rebuilds the tool/resource registries so
|
|
19
|
+
* the next tools/list call returns only [pica_sign_in, pica_sign_out].
|
|
20
|
+
*
|
|
21
|
+
* Without this the server would keep advertising the full authenticated
|
|
22
|
+
* tool surface after sign_out until the process is restarted, which
|
|
23
|
+
* lies about what's actually available — every privileged tool call
|
|
24
|
+
* would still fail at the API layer (no PicaClient), but the surface
|
|
25
|
+
* itself shouldn't pretend the catalog is reachable.
|
|
26
|
+
*/
|
|
27
|
+
signOut(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Set up MCP protocol handlers on the main server instance (for stdio)
|
|
30
|
+
*/
|
|
31
|
+
private setupHandlers;
|
|
32
|
+
/**
|
|
33
|
+
* Start the MCP server.
|
|
34
|
+
*
|
|
35
|
+
* Transport is selected by environment:
|
|
36
|
+
* - MCP_TRANSPORT=http → HTTP server on MCP_PORT (default 3100)
|
|
37
|
+
* - Otherwise → stdio (default, for Claude Code / Cursor / VS Code)
|
|
38
|
+
*/
|
|
39
|
+
start(): Promise<void>;
|
|
40
|
+
private startStdio;
|
|
41
|
+
private startHttp;
|
|
42
|
+
/**
|
|
43
|
+
* Register protocol handlers on a server instance.
|
|
44
|
+
* Used by both the main server (stdio) and per-request servers (HTTP).
|
|
45
|
+
*/
|
|
46
|
+
private registerHandlers;
|
|
47
|
+
/**
|
|
48
|
+
* Stop the MCP server
|
|
49
|
+
*/
|
|
50
|
+
stop(): Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAe3C,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAkC;gBAEzC,MAAM,EAAE,YAAY;IAqEhC;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgDlC;;;;;;;;;;;OAWG;IACH,OAAO,IAAI,IAAI;IAqCf;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;;;;;OAMG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAqBd,UAAU;YAKV,SAAS;IA6HvB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAkDxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAS5B"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// Copyright (c) 2024-2026 Withpica Ltd. All rights reserved.
|
|
2
|
+
/**
|
|
3
|
+
* MCP Server for PICA Platform
|
|
4
|
+
* Enables AI assistants to interact with PICA via the Model Context Protocol
|
|
5
|
+
*/
|
|
6
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
7
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
8
|
+
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
|
|
9
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
10
|
+
import { createServer } from "node:http";
|
|
11
|
+
import { timingSafeEqual } from "node:crypto";
|
|
12
|
+
import { PicaClient } from "@withpica/mcp-sdk";
|
|
13
|
+
import { ToolRegistry } from "./tools/index.js";
|
|
14
|
+
import { ResourceRegistry } from "./resources/index.js";
|
|
15
|
+
import { PromptRegistry } from "./prompts/index.js";
|
|
16
|
+
import { logError } from "@withpica/mcp-utils";
|
|
17
|
+
import { makeStdioCallerContext, makeHttpAuditFn, McpAuditLogger, } from "@withpica/mcp-utils";
|
|
18
|
+
import { SERVER_INSTRUCTIONS_AUTHENTICATED, SERVER_INSTRUCTIONS_UNAUTHENTICATED, } from "./server-instructions.js";
|
|
19
|
+
export class PicaMcpServer {
|
|
20
|
+
server;
|
|
21
|
+
pica;
|
|
22
|
+
toolRegistry;
|
|
23
|
+
resourceRegistry;
|
|
24
|
+
promptRegistry;
|
|
25
|
+
config;
|
|
26
|
+
httpServer;
|
|
27
|
+
constructor(config) {
|
|
28
|
+
this.config = config;
|
|
29
|
+
// Initialize PICA SDK client (null in lobby mode)
|
|
30
|
+
if (config.picaApiKey) {
|
|
31
|
+
this.pica = new PicaClient({
|
|
32
|
+
apiKey: config.picaApiKey,
|
|
33
|
+
baseUrl: config.picaApiUrl,
|
|
34
|
+
debug: config.debug,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
this.pica = null;
|
|
39
|
+
}
|
|
40
|
+
// Initialize MCP server
|
|
41
|
+
// ADR-211 Phase 1 Primitive C: select the lobby variant of
|
|
42
|
+
// server-instructions when the binary boots without a connection key.
|
|
43
|
+
// The authenticated variant covers 200+ catalog tools; the lobby
|
|
44
|
+
// variant points at the 3 lobby tools (pica_signup_start +
|
|
45
|
+
// pica_sign_in + pica_sign_out) since none of the catalog surface
|
|
46
|
+
// is reachable yet.
|
|
47
|
+
const handshakeInstructions = config.lobbyMode
|
|
48
|
+
? SERVER_INSTRUCTIONS_UNAUTHENTICATED
|
|
49
|
+
: SERVER_INSTRUCTIONS_AUTHENTICATED;
|
|
50
|
+
this.server = new Server({
|
|
51
|
+
name: config.serverName,
|
|
52
|
+
version: config.version,
|
|
53
|
+
}, {
|
|
54
|
+
capabilities: {
|
|
55
|
+
// listChanged: true on tools + resources tells the client we
|
|
56
|
+
// may emit `notifications/tools/list_changed` and
|
|
57
|
+
// `notifications/resources/list_changed` after sign-in or
|
|
58
|
+
// sign-out hot-swaps the registries. Without this declaration
|
|
59
|
+
// the client won't subscribe to those notifications, and the
|
|
60
|
+
// tool surface stays frozen at the lobby pair forever.
|
|
61
|
+
tools: { listChanged: true },
|
|
62
|
+
resources: { listChanged: true },
|
|
63
|
+
prompts: {},
|
|
64
|
+
},
|
|
65
|
+
instructions: handshakeInstructions,
|
|
66
|
+
});
|
|
67
|
+
// Initialize registries with stdio caller context (api key hash)
|
|
68
|
+
this.toolRegistry = new ToolRegistry(this.pica, config, (apiKey) => this.reinitialize(apiKey), makeStdioCallerContext(config.picaApiKey), () => this.signOut());
|
|
69
|
+
this.resourceRegistry = new ResourceRegistry(this.pica, config);
|
|
70
|
+
this.promptRegistry = new PromptRegistry();
|
|
71
|
+
// Wire audit logger — fire-and-forget POST to /api/mcp/audit
|
|
72
|
+
this.toolRegistry.setAuditLogger(new McpAuditLogger(makeHttpAuditFn({
|
|
73
|
+
baseUrl: config.picaApiUrl,
|
|
74
|
+
apiKey: config.picaApiKey,
|
|
75
|
+
})));
|
|
76
|
+
this.setupHandlers();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Reinitialize server with new credentials (called after successful auth)
|
|
80
|
+
*/
|
|
81
|
+
reinitialize(apiKey) {
|
|
82
|
+
this.pica = new PicaClient({
|
|
83
|
+
apiKey,
|
|
84
|
+
baseUrl: this.config.picaApiUrl,
|
|
85
|
+
debug: this.config.debug,
|
|
86
|
+
});
|
|
87
|
+
this.config = { ...this.config, picaApiKey: apiKey, lobbyMode: false };
|
|
88
|
+
this.toolRegistry = new ToolRegistry(this.pica, this.config, (key) => this.reinitialize(key), makeStdioCallerContext(apiKey), () => this.signOut());
|
|
89
|
+
this.toolRegistry.setAuditLogger(new McpAuditLogger(makeHttpAuditFn({ baseUrl: this.config.picaApiUrl, apiKey })));
|
|
90
|
+
this.resourceRegistry = new ResourceRegistry(this.pica, this.config);
|
|
91
|
+
console.error("[MCP Server] Reinitialized with new credentials");
|
|
92
|
+
// Tell the client the tool + resource lists have changed so it
|
|
93
|
+
// re-fetches and discovers the full authenticated surface. Without
|
|
94
|
+
// these notifications the client keeps showing the lobby pair
|
|
95
|
+
// (sign_in/sign_out) even though sign-in succeeded — the in-memory
|
|
96
|
+
// registries on the server know about the 168 catalog tools but
|
|
97
|
+
// the client never asks for them again.
|
|
98
|
+
//
|
|
99
|
+
// Fire-and-forget: a failure to notify is a soft error (the user
|
|
100
|
+
// can manually trigger another tool call which will work since the
|
|
101
|
+
// server's internal state is correct), so we log and continue
|
|
102
|
+
// rather than throwing inside the callback path that just rebuilt
|
|
103
|
+
// the registries.
|
|
104
|
+
this.server.sendToolListChanged().catch((err) => {
|
|
105
|
+
console.error("[MCP Server] Failed to send tools/list_changed notification:", err);
|
|
106
|
+
});
|
|
107
|
+
this.server.sendResourceListChanged().catch((err) => {
|
|
108
|
+
console.error("[MCP Server] Failed to send resources/list_changed notification:", err);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Reset the server back to lobby mode (called after sign_out).
|
|
113
|
+
* Mirrors reinitialize() but in reverse: clears the PicaClient,
|
|
114
|
+
* sets lobbyMode=true, and rebuilds the tool/resource registries so
|
|
115
|
+
* the next tools/list call returns only [pica_sign_in, pica_sign_out].
|
|
116
|
+
*
|
|
117
|
+
* Without this the server would keep advertising the full authenticated
|
|
118
|
+
* tool surface after sign_out until the process is restarted, which
|
|
119
|
+
* lies about what's actually available — every privileged tool call
|
|
120
|
+
* would still fail at the API layer (no PicaClient), but the surface
|
|
121
|
+
* itself shouldn't pretend the catalog is reachable.
|
|
122
|
+
*/
|
|
123
|
+
signOut() {
|
|
124
|
+
this.pica = null;
|
|
125
|
+
this.config = { ...this.config, picaApiKey: "", lobbyMode: true };
|
|
126
|
+
this.toolRegistry = new ToolRegistry(this.pica, this.config, (key) => this.reinitialize(key), makeStdioCallerContext(""), () => this.signOut());
|
|
127
|
+
this.toolRegistry.setAuditLogger(new McpAuditLogger(makeHttpAuditFn({ baseUrl: this.config.picaApiUrl, apiKey: "" })));
|
|
128
|
+
this.resourceRegistry = new ResourceRegistry(this.pica, this.config);
|
|
129
|
+
console.error("[MCP Server] Reset to lobby mode after sign_out");
|
|
130
|
+
// Same listChanged story as reinitialize() — without these the
|
|
131
|
+
// client keeps advertising the full authenticated surface to the
|
|
132
|
+
// model after sign-out, and any tool call would fail at the API
|
|
133
|
+
// layer with a confusing "no credentials" error instead of the
|
|
134
|
+
// model saying "you need to sign in first."
|
|
135
|
+
this.server.sendToolListChanged().catch((err) => {
|
|
136
|
+
console.error("[MCP Server] Failed to send tools/list_changed notification (signOut):", err);
|
|
137
|
+
});
|
|
138
|
+
this.server.sendResourceListChanged().catch((err) => {
|
|
139
|
+
console.error("[MCP Server] Failed to send resources/list_changed notification (signOut):", err);
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Set up MCP protocol handlers on the main server instance (for stdio)
|
|
144
|
+
*/
|
|
145
|
+
setupHandlers() {
|
|
146
|
+
this.registerHandlers(this.server);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Start the MCP server.
|
|
150
|
+
*
|
|
151
|
+
* Transport is selected by environment:
|
|
152
|
+
* - MCP_TRANSPORT=http → HTTP server on MCP_PORT (default 3100)
|
|
153
|
+
* - Otherwise → stdio (default, for Claude Code / Cursor / VS Code)
|
|
154
|
+
*/
|
|
155
|
+
async start() {
|
|
156
|
+
const mode = process.env.MCP_TRANSPORT;
|
|
157
|
+
if (mode === "http") {
|
|
158
|
+
await this.startHttp();
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
await this.startStdio();
|
|
162
|
+
}
|
|
163
|
+
console.error("[MCP Server] PICA MCP Server started");
|
|
164
|
+
console.error(`[MCP Server] Version: ${this.config.version}`);
|
|
165
|
+
console.error(`[MCP Server] Transport: ${mode === "http" ? "HTTP" : "stdio"}`);
|
|
166
|
+
console.error(`[MCP Server] Mode: ${this.config.lobbyMode ? "lobby (sign in to connect)" : "authenticated"}`);
|
|
167
|
+
console.error(`[MCP Server] API URL: ${this.config.picaApiUrl}`);
|
|
168
|
+
console.error("[MCP Server] Ready to accept connections");
|
|
169
|
+
}
|
|
170
|
+
async startStdio() {
|
|
171
|
+
const transport = new StdioServerTransport();
|
|
172
|
+
await this.server.connect(transport);
|
|
173
|
+
}
|
|
174
|
+
async startHttp() {
|
|
175
|
+
const port = parseInt(process.env.MCP_PORT || "3100", 10);
|
|
176
|
+
// Each HTTP request gets its own transport instance (stateless sessions)
|
|
177
|
+
const httpServer = createServer(async (req, res) => {
|
|
178
|
+
// CORS headers for browser-based clients
|
|
179
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
180
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, DELETE");
|
|
181
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Mcp-Session-Id");
|
|
182
|
+
res.setHeader("Access-Control-Expose-Headers", "Mcp-Session-Id");
|
|
183
|
+
if (req.method === "OPTIONS") {
|
|
184
|
+
res.writeHead(204);
|
|
185
|
+
res.end();
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
// Auth check — require MCP_HTTP_SECRET or PICA_API_KEY as Bearer token
|
|
189
|
+
const httpSecret = process.env.MCP_HTTP_SECRET || process.env.PICA_API_KEY;
|
|
190
|
+
if (httpSecret) {
|
|
191
|
+
const authHeader = req.headers["authorization"] ?? "";
|
|
192
|
+
const token = authHeader.startsWith("Bearer ")
|
|
193
|
+
? authHeader.slice(7)
|
|
194
|
+
: "";
|
|
195
|
+
const tokenBuf = Buffer.from(token);
|
|
196
|
+
const secretBuf = Buffer.from(httpSecret);
|
|
197
|
+
const isValid = tokenBuf.length === secretBuf.length &&
|
|
198
|
+
timingSafeEqual(tokenBuf, secretBuf);
|
|
199
|
+
if (!isValid) {
|
|
200
|
+
res.writeHead(401, { "Content-Type": "application/json" });
|
|
201
|
+
res.end(JSON.stringify({ error: "Unauthorized" }));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Health check
|
|
206
|
+
if (req.method === "GET" && req.url === "/health") {
|
|
207
|
+
res.writeHead(200, { "Content-Type": "application/json" });
|
|
208
|
+
res.end(JSON.stringify({
|
|
209
|
+
status: "ok",
|
|
210
|
+
server: this.config.serverName,
|
|
211
|
+
version: this.config.version,
|
|
212
|
+
tools: this.toolRegistry.listTools().length,
|
|
213
|
+
}));
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
// MCP endpoint — create per-request transport
|
|
217
|
+
if (req.url === "/mcp" || req.url === "/") {
|
|
218
|
+
try {
|
|
219
|
+
// Read body
|
|
220
|
+
const chunks = [];
|
|
221
|
+
for await (const chunk of req) {
|
|
222
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
223
|
+
}
|
|
224
|
+
const body = Buffer.concat(chunks).toString("utf-8");
|
|
225
|
+
const parsedBody = body ? JSON.parse(body) : undefined;
|
|
226
|
+
const transport = new StreamableHTTPServerTransport({
|
|
227
|
+
sessionIdGenerator: undefined, // stateless
|
|
228
|
+
});
|
|
229
|
+
// Connect a fresh server instance for this request
|
|
230
|
+
const requestServer = new Server({
|
|
231
|
+
name: this.config.serverName,
|
|
232
|
+
version: this.config.version,
|
|
233
|
+
}, {
|
|
234
|
+
capabilities: {
|
|
235
|
+
tools: {},
|
|
236
|
+
resources: {},
|
|
237
|
+
prompts: {},
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
// Re-register handlers on the request-scoped server
|
|
241
|
+
this.registerHandlers(requestServer);
|
|
242
|
+
await requestServer.connect(transport);
|
|
243
|
+
await transport.handleRequest(req, res, parsedBody);
|
|
244
|
+
}
|
|
245
|
+
catch (err) {
|
|
246
|
+
if (this.config.debug) {
|
|
247
|
+
console.error("[MCP Server] HTTP request error:", err);
|
|
248
|
+
}
|
|
249
|
+
if (!res.headersSent) {
|
|
250
|
+
res.writeHead(500, { "Content-Type": "application/json" });
|
|
251
|
+
res.end(JSON.stringify({ error: "Internal server error" }));
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// 404
|
|
257
|
+
res.writeHead(404, { "Content-Type": "application/json" });
|
|
258
|
+
res.end(JSON.stringify({ error: "Not found" }));
|
|
259
|
+
});
|
|
260
|
+
this.httpServer = httpServer;
|
|
261
|
+
await new Promise((resolve) => {
|
|
262
|
+
httpServer.listen(port, () => {
|
|
263
|
+
console.error(`[MCP Server] HTTP listening on port ${port}`);
|
|
264
|
+
console.error(`[MCP Server] Endpoint: http://localhost:${port}/mcp`);
|
|
265
|
+
console.error(`[MCP Server] Health: http://localhost:${port}/health`);
|
|
266
|
+
resolve();
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Register protocol handlers on a server instance.
|
|
272
|
+
* Used by both the main server (stdio) and per-request servers (HTTP).
|
|
273
|
+
*/
|
|
274
|
+
registerHandlers(server) {
|
|
275
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
276
|
+
tools: this.toolRegistry.listTools(),
|
|
277
|
+
}));
|
|
278
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
279
|
+
const { name, arguments: args, _meta } = request.params;
|
|
280
|
+
const toolArgs = _meta ? { ...(args || {}), _meta } : args || {};
|
|
281
|
+
try {
|
|
282
|
+
// ADR-200 Phase 1: pass the per-request `Server` so executors can
|
|
283
|
+
// call `server.elicitInput()` / `server.getClientCapabilities()`
|
|
284
|
+
// when issuing an elicitation/create request. Each per-request
|
|
285
|
+
// HTTP server is a different instance; positional context
|
|
286
|
+
// avoids registry-level state that would race across calls.
|
|
287
|
+
return await this.toolRegistry.executeTool(name, toolArgs, { server });
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
logError(`Tool execution: ${name}`, error);
|
|
291
|
+
throw error;
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
295
|
+
resources: this.resourceRegistry.listResources(),
|
|
296
|
+
}));
|
|
297
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
298
|
+
const { uri } = request.params;
|
|
299
|
+
try {
|
|
300
|
+
return await this.resourceRegistry.readResource(uri);
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
logError(`Resource read: ${uri}`, error);
|
|
304
|
+
throw error;
|
|
305
|
+
}
|
|
306
|
+
});
|
|
307
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
308
|
+
prompts: this.promptRegistry.listPrompts(),
|
|
309
|
+
}));
|
|
310
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
311
|
+
const { name, arguments: args } = request.params;
|
|
312
|
+
try {
|
|
313
|
+
return await this.promptRegistry.getPrompt(name, args);
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
logError(`Prompt get: ${name}`, error);
|
|
317
|
+
throw error;
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Stop the MCP server
|
|
323
|
+
*/
|
|
324
|
+
async stop() {
|
|
325
|
+
if (this.httpServer) {
|
|
326
|
+
await new Promise((resolve) => {
|
|
327
|
+
this.httpServer.close(() => resolve());
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
await this.server.close();
|
|
331
|
+
console.error("[MCP Server] Server stopped");
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Access Simulate MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Read-only "who would see what?" simulator. Given an entity + an
|
|
5
|
+
* action + a hypothetical recipient, returns the field-level
|
|
6
|
+
* visibility matrix and the chain of rules that produced the answer.
|
|
7
|
+
*
|
|
8
|
+
* v1 implements share_link_preview for works with real logic; other
|
|
9
|
+
* actions and entity types return a structured `not_yet_supported`
|
|
10
|
+
* scaffold so agents can iterate against the stable shape.
|
|
11
|
+
*/
|
|
12
|
+
import { PicaClient } from "@withpica/mcp-sdk";
|
|
13
|
+
import type { ToolDefinition, ToolExecutor } from "./index.js";
|
|
14
|
+
export declare class AccessSimulateTools {
|
|
15
|
+
private pica;
|
|
16
|
+
constructor(pica: PicaClient);
|
|
17
|
+
getTools(): Array<{
|
|
18
|
+
definition: ToolDefinition;
|
|
19
|
+
executor: ToolExecutor;
|
|
20
|
+
}>;
|
|
21
|
+
private simulate;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=access-simulate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"access-simulate.d.ts","sourceRoot":"","sources":["../../src/tools/access-simulate.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAO3E,qBAAa,mBAAmB;IAC9B,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+I3D,QAAQ;CAoCvB"}
|