@cesteral/linkedin-mcp 1.0.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/LICENSE.md +201 -0
- package/README.md +304 -0
- package/dist/auth/index.d.ts +3 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/linkedin-auth-adapter.d.ts +38 -0
- package/dist/auth/linkedin-auth-adapter.d.ts.map +1 -0
- package/dist/auth/linkedin-auth-adapter.js +110 -0
- package/dist/auth/linkedin-auth-adapter.js.map +1 -0
- package/dist/auth/linkedin-auth-strategy.d.ts +14 -0
- package/dist/auth/linkedin-auth-strategy.d.ts.map +1 -0
- package/dist/auth/linkedin-auth-strategy.js +50 -0
- package/dist/auth/linkedin-auth-strategy.js.map +1 -0
- package/dist/config/index.d.ts +100 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +37 -0
- package/dist/config/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/analytics-reporting-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/analytics-reporting-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/analytics-reporting-workflow.prompt.js +108 -0
- package/dist/mcp-server/prompts/definitions/analytics-reporting-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.js +177 -0
- package/dist/mcp-server/prompts/definitions/bulk-operations-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.js +171 -0
- package/dist/mcp-server/prompts/definitions/campaign-setup-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/creative-upload-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/creative-upload-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/creative-upload-workflow.prompt.js +109 -0
- package/dist/mcp-server/prompts/definitions/creative-upload-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.js +299 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-campaign-setup.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.js +170 -0
- package/dist/mcp-server/prompts/definitions/cross-platform-performance.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.js +213 -0
- package/dist/mcp-server/prompts/definitions/entity-duplication-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.js +151 -0
- package/dist/mcp-server/prompts/definitions/entity-update-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.js +217 -0
- package/dist/mcp-server/prompts/definitions/targeting-discovery-workflow.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.js +98 -0
- package/dist/mcp-server/prompts/definitions/tool-schema-exploration.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.d.ts +4 -0
- package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.js +91 -0
- package/dist/mcp-server/prompts/definitions/troubleshoot-entity.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/index.d.ts +9 -0
- package/dist/mcp-server/prompts/index.d.ts.map +1 -0
- package/dist/mcp-server/prompts/index.js +97 -0
- package/dist/mcp-server/prompts/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/analytics-reference.resource.d.ts +3 -0
- package/dist/mcp-server/resources/definitions/analytics-reference.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/analytics-reference.resource.js +162 -0
- package/dist/mcp-server/resources/definitions/analytics-reference.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-examples.resource.d.ts +4 -0
- package/dist/mcp-server/resources/definitions/entity-examples.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-examples.resource.js +164 -0
- package/dist/mcp-server/resources/definitions/entity-examples.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.d.ts +3 -0
- package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.js +144 -0
- package/dist/mcp-server/resources/definitions/entity-hierarchy.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-schemas.resource.d.ts +4 -0
- package/dist/mcp-server/resources/definitions/entity-schemas.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/entity-schemas.resource.js +127 -0
- package/dist/mcp-server/resources/definitions/entity-schemas.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/index.d.ts +8 -0
- package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/index.js +54 -0
- package/dist/mcp-server/resources/definitions/index.js.map +1 -0
- package/dist/mcp-server/resources/definitions/targeting-reference.resource.d.ts +3 -0
- package/dist/mcp-server/resources/definitions/targeting-reference.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/targeting-reference.resource.js +122 -0
- package/dist/mcp-server/resources/definitions/targeting-reference.resource.js.map +1 -0
- package/dist/mcp-server/resources/index.d.ts +3 -0
- package/dist/mcp-server/resources/index.d.ts.map +1 -0
- package/dist/mcp-server/resources/index.js +2 -0
- package/dist/mcp-server/resources/index.js.map +1 -0
- package/dist/mcp-server/resources/types.d.ts +8 -0
- package/dist/mcp-server/resources/types.d.ts.map +1 -0
- package/dist/mcp-server/resources/types.js +2 -0
- package/dist/mcp-server/resources/types.js.map +1 -0
- package/dist/mcp-server/server.d.ts +5 -0
- package/dist/mcp-server/server.d.ts.map +1 -0
- package/dist/mcp-server/server.js +128 -0
- package/dist/mcp-server/server.js.map +1 -0
- package/dist/mcp-server/tools/definitions/adjust-bids.tool.d.ts +213 -0
- package/dist/mcp-server/tools/definitions/adjust-bids.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/adjust-bids.tool.js +174 -0
- package/dist/mcp-server/tools/definitions/adjust-bids.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.d.ts +128 -0
- package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.js +95 -0
- package/dist/mcp-server/tools/definitions/bulk-create-entities.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-update-entities.tool.d.ts +183 -0
- package/dist/mcp-server/tools/definitions/bulk-update-entities.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-update-entities.tool.js +122 -0
- package/dist/mcp-server/tools/definitions/bulk-update-entities.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-update-status.tool.d.ts +140 -0
- package/dist/mcp-server/tools/definitions/bulk-update-status.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/bulk-update-status.tool.js +109 -0
- package/dist/mcp-server/tools/definitions/bulk-update-status.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/create-entity.tool.d.ts +117 -0
- package/dist/mcp-server/tools/definitions/create-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/create-entity.tool.js +98 -0
- package/dist/mcp-server/tools/definitions/create-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/delete-entity.tool.d.ts +93 -0
- package/dist/mcp-server/tools/definitions/delete-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/delete-entity.tool.js +100 -0
- package/dist/mcp-server/tools/definitions/delete-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/duplicate-entity.tool.d.ts +95 -0
- package/dist/mcp-server/tools/definitions/duplicate-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/duplicate-entity.tool.js +89 -0
- package/dist/mcp-server/tools/definitions/duplicate-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-ad-preview.tool.d.ts +75 -0
- package/dist/mcp-server/tools/definitions/get-ad-preview.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-ad-preview.tool.js +68 -0
- package/dist/mcp-server/tools/definitions/get-ad-preview.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-ad-previews.tool.d.ts +75 -0
- package/dist/mcp-server/tools/definitions/get-ad-previews.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-ad-previews.tool.js +71 -0
- package/dist/mcp-server/tools/definitions/get-ad-previews.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-analytics-breakdowns.tool.d.ts +223 -0
- package/dist/mcp-server/tools/definitions/get-analytics-breakdowns.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-analytics-breakdowns.tool.js +152 -0
- package/dist/mcp-server/tools/definitions/get-analytics-breakdowns.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-analytics.tool.d.ts +325 -0
- package/dist/mcp-server/tools/definitions/get-analytics.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-analytics.tool.js +154 -0
- package/dist/mcp-server/tools/definitions/get-analytics.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-delivery-forecast.tool.d.ts +95 -0
- package/dist/mcp-server/tools/definitions/get-delivery-forecast.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-delivery-forecast.tool.js +90 -0
- package/dist/mcp-server/tools/definitions/get-delivery-forecast.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-entity.tool.d.ts +75 -0
- package/dist/mcp-server/tools/definitions/get-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-entity.tool.js +75 -0
- package/dist/mcp-server/tools/definitions/get-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/get-targeting-options.tool.d.ts +81 -0
- package/dist/mcp-server/tools/definitions/get-targeting-options.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/get-targeting-options.tool.js +76 -0
- package/dist/mcp-server/tools/definitions/get-targeting-options.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/index.d.ts +23 -0
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/index.js +69 -0
- package/dist/mcp-server/tools/definitions/index.js.map +1 -0
- package/dist/mcp-server/tools/definitions/list-ad-accounts.tool.d.ts +141 -0
- package/dist/mcp-server/tools/definitions/list-ad-accounts.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/list-ad-accounts.tool.js +84 -0
- package/dist/mcp-server/tools/definitions/list-ad-accounts.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/list-entities.tool.d.ts +165 -0
- package/dist/mcp-server/tools/definitions/list-entities.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/list-entities.tool.js +112 -0
- package/dist/mcp-server/tools/definitions/list-entities.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/search-targeting.tool.d.ts +102 -0
- package/dist/mcp-server/tools/definitions/search-targeting.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/search-targeting.tool.js +98 -0
- package/dist/mcp-server/tools/definitions/search-targeting.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/update-entity.tool.d.ts +104 -0
- package/dist/mcp-server/tools/definitions/update-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/update-entity.tool.js +88 -0
- package/dist/mcp-server/tools/definitions/update-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/upload-image.tool.d.ts +75 -0
- package/dist/mcp-server/tools/definitions/upload-image.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/upload-image.tool.js +99 -0
- package/dist/mcp-server/tools/definitions/upload-image.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/upload-video.tool.d.ts +69 -0
- package/dist/mcp-server/tools/definitions/upload-video.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/upload-video.tool.js +98 -0
- package/dist/mcp-server/tools/definitions/upload-video.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/validate-entity.tool.d.ts +168 -0
- package/dist/mcp-server/tools/definitions/validate-entity.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/validate-entity.tool.js +200 -0
- package/dist/mcp-server/tools/definitions/validate-entity.tool.js.map +1 -0
- package/dist/mcp-server/tools/index.d.ts +2 -0
- package/dist/mcp-server/tools/index.d.ts.map +1 -0
- package/dist/mcp-server/tools/index.js +2 -0
- package/dist/mcp-server/tools/index.js.map +1 -0
- package/dist/mcp-server/tools/utils/entity-mapping.d.ts +13 -0
- package/dist/mcp-server/tools/utils/entity-mapping.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/entity-mapping.js +68 -0
- package/dist/mcp-server/tools/utils/entity-mapping.js.map +1 -0
- package/dist/mcp-server/tools/utils/media-types.d.ts +12 -0
- package/dist/mcp-server/tools/utils/media-types.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/media-types.js +2 -0
- package/dist/mcp-server/tools/utils/media-types.js.map +1 -0
- package/dist/mcp-server/tools/utils/resolve-session.d.ts +4 -0
- package/dist/mcp-server/tools/utils/resolve-session.d.ts.map +1 -0
- package/dist/mcp-server/tools/utils/resolve-session.js +6 -0
- package/dist/mcp-server/tools/utils/resolve-session.js.map +1 -0
- package/dist/mcp-server/transports/streamable-http-transport.d.ts +49 -0
- package/dist/mcp-server/transports/streamable-http-transport.d.ts.map +1 -0
- package/dist/mcp-server/transports/streamable-http-transport.js +91 -0
- package/dist/mcp-server/transports/streamable-http-transport.js.map +1 -0
- package/dist/services/linkedin/linkedin-http-client.d.ts +20 -0
- package/dist/services/linkedin/linkedin-http-client.d.ts.map +1 -0
- package/dist/services/linkedin/linkedin-http-client.js +147 -0
- package/dist/services/linkedin/linkedin-http-client.js.map +1 -0
- package/dist/services/linkedin/linkedin-reporting-service.d.ts +26 -0
- package/dist/services/linkedin/linkedin-reporting-service.d.ts.map +1 -0
- package/dist/services/linkedin/linkedin-reporting-service.js +69 -0
- package/dist/services/linkedin/linkedin-reporting-service.js.map +1 -0
- package/dist/services/linkedin/linkedin-service.d.ts +84 -0
- package/dist/services/linkedin/linkedin-service.d.ts.map +1 -0
- package/dist/services/linkedin/linkedin-service.js +195 -0
- package/dist/services/linkedin/linkedin-service.js.map +1 -0
- package/dist/services/linkedin/types.d.ts +166 -0
- package/dist/services/linkedin/types.d.ts.map +1 -0
- package/dist/services/linkedin/types.js +31 -0
- package/dist/services/linkedin/types.js.map +1 -0
- package/dist/services/session-services.d.ts +18 -0
- package/dist/services/session-services.d.ts.map +1 -0
- package/dist/services/session-services.js +16 -0
- package/dist/services/session-services.js.map +1 -0
- package/dist/types-global/mcp.d.ts +2 -0
- package/dist/types-global/mcp.d.ts.map +1 -0
- package/dist/types-global/mcp.js +2 -0
- package/dist/types-global/mcp.js.map +1 -0
- package/dist/utils/errors/index.d.ts +2 -0
- package/dist/utils/errors/index.d.ts.map +1 -0
- package/dist/utils/errors/index.js +2 -0
- package/dist/utils/errors/index.js.map +1 -0
- package/dist/utils/platform.d.ts +3 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +5 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/security/rate-limiter.d.ts +3 -0
- package/dist/utils/security/rate-limiter.d.ts.map +1 -0
- package/dist/utils/security/rate-limiter.js +5 -0
- package/dist/utils/security/rate-limiter.js.map +1 -0
- package/dist/utils/telemetry/index.d.ts +2 -0
- package/dist/utils/telemetry/index.d.ts.map +1 -0
- package/dist/utils/telemetry/index.js +2 -0
- package/dist/utils/telemetry/index.js.map +1 -0
- package/dist/utils/telemetry/tracing.d.ts +3 -0
- package/dist/utils/telemetry/tracing.d.ts.map +1 -0
- package/dist/utils/telemetry/tracing.js +4 -0
- package/dist/utils/telemetry/tracing.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { type LinkedInEntityType } from "../utils/entity-mapping.js";
|
|
2
|
+
export declare const validateEntityTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
title: string;
|
|
5
|
+
description: string;
|
|
6
|
+
inputSchema: import("zod").ZodObject<{
|
|
7
|
+
entityType: import("zod").ZodEnum<[LinkedInEntityType, ...LinkedInEntityType[]]>;
|
|
8
|
+
mode: import("zod").ZodEnum<["create", "update"]>;
|
|
9
|
+
data: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
|
|
10
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
11
|
+
entityType: LinkedInEntityType;
|
|
12
|
+
data: Record<string, unknown>;
|
|
13
|
+
mode: "create" | "update";
|
|
14
|
+
}, {
|
|
15
|
+
entityType: LinkedInEntityType;
|
|
16
|
+
data: Record<string, unknown>;
|
|
17
|
+
mode: "create" | "update";
|
|
18
|
+
}>;
|
|
19
|
+
outputSchema: import("zod").ZodObject<{
|
|
20
|
+
valid: import("zod").ZodBoolean;
|
|
21
|
+
entityType: import("zod").ZodString;
|
|
22
|
+
mode: import("zod").ZodString;
|
|
23
|
+
issues: import("zod").ZodArray<import("zod").ZodObject<{
|
|
24
|
+
field: import("zod").ZodString;
|
|
25
|
+
code: import("zod").ZodEnum<["missing", "wrongType", "invalidValue", "readOnly", "custom"]>;
|
|
26
|
+
message: import("zod").ZodString;
|
|
27
|
+
hint: import("zod").ZodOptional<import("zod").ZodString>;
|
|
28
|
+
suggestedValues: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
|
|
29
|
+
severity: import("zod").ZodOptional<import("zod").ZodEnum<["error", "warning"]>>;
|
|
30
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
31
|
+
code: "custom" | "missing" | "wrongType" | "invalidValue" | "readOnly";
|
|
32
|
+
message: string;
|
|
33
|
+
field: string;
|
|
34
|
+
hint?: string | undefined;
|
|
35
|
+
suggestedValues?: string[] | undefined;
|
|
36
|
+
severity?: "error" | "warning" | undefined;
|
|
37
|
+
}, {
|
|
38
|
+
code: "custom" | "missing" | "wrongType" | "invalidValue" | "readOnly";
|
|
39
|
+
message: string;
|
|
40
|
+
field: string;
|
|
41
|
+
hint?: string | undefined;
|
|
42
|
+
suggestedValues?: string[] | undefined;
|
|
43
|
+
severity?: "error" | "warning" | undefined;
|
|
44
|
+
}>, "many">;
|
|
45
|
+
nextAction: import("zod").ZodOptional<import("zod").ZodString>;
|
|
46
|
+
timestamp: import("zod").ZodString;
|
|
47
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
48
|
+
issues: {
|
|
49
|
+
code: "custom" | "missing" | "wrongType" | "invalidValue" | "readOnly";
|
|
50
|
+
message: string;
|
|
51
|
+
field: string;
|
|
52
|
+
hint?: string | undefined;
|
|
53
|
+
suggestedValues?: string[] | undefined;
|
|
54
|
+
severity?: "error" | "warning" | undefined;
|
|
55
|
+
}[];
|
|
56
|
+
valid: boolean;
|
|
57
|
+
entityType: string;
|
|
58
|
+
mode: string;
|
|
59
|
+
timestamp: string;
|
|
60
|
+
nextAction?: string | undefined;
|
|
61
|
+
}, {
|
|
62
|
+
issues: {
|
|
63
|
+
code: "custom" | "missing" | "wrongType" | "invalidValue" | "readOnly";
|
|
64
|
+
message: string;
|
|
65
|
+
field: string;
|
|
66
|
+
hint?: string | undefined;
|
|
67
|
+
suggestedValues?: string[] | undefined;
|
|
68
|
+
severity?: "error" | "warning" | undefined;
|
|
69
|
+
}[];
|
|
70
|
+
valid: boolean;
|
|
71
|
+
entityType: string;
|
|
72
|
+
mode: string;
|
|
73
|
+
timestamp: string;
|
|
74
|
+
nextAction?: string | undefined;
|
|
75
|
+
}>;
|
|
76
|
+
annotations: {
|
|
77
|
+
readOnlyHint: boolean;
|
|
78
|
+
idempotentHint: boolean;
|
|
79
|
+
openWorldHint: boolean;
|
|
80
|
+
destructiveHint: boolean;
|
|
81
|
+
};
|
|
82
|
+
inputExamples: {
|
|
83
|
+
label: string;
|
|
84
|
+
input: Record<string, unknown>;
|
|
85
|
+
}[];
|
|
86
|
+
logic: (input: {
|
|
87
|
+
entityType: LinkedInEntityType;
|
|
88
|
+
data: Record<string, unknown>;
|
|
89
|
+
mode: "create" | "update";
|
|
90
|
+
}, _context: import("@cesteral/shared").RequestContext, _sdkContext?: import("@cesteral/shared").SdkContext) => Promise<import("@cesteral/shared").ValidateEntityOutput>;
|
|
91
|
+
responseFormatter: typeof import("@cesteral/shared").validateEntityResponseFormatter;
|
|
92
|
+
};
|
|
93
|
+
export declare const ValidateEntityInputSchema: import("zod").ZodObject<{
|
|
94
|
+
entityType: import("zod").ZodEnum<[LinkedInEntityType, ...LinkedInEntityType[]]>;
|
|
95
|
+
mode: import("zod").ZodEnum<["create", "update"]>;
|
|
96
|
+
data: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
|
|
97
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
98
|
+
entityType: LinkedInEntityType;
|
|
99
|
+
data: Record<string, unknown>;
|
|
100
|
+
mode: "create" | "update";
|
|
101
|
+
}, {
|
|
102
|
+
entityType: LinkedInEntityType;
|
|
103
|
+
data: Record<string, unknown>;
|
|
104
|
+
mode: "create" | "update";
|
|
105
|
+
}>;
|
|
106
|
+
export declare const ValidateEntityOutputSchema: import("zod").ZodObject<{
|
|
107
|
+
valid: import("zod").ZodBoolean;
|
|
108
|
+
entityType: import("zod").ZodString;
|
|
109
|
+
mode: import("zod").ZodString;
|
|
110
|
+
issues: import("zod").ZodArray<import("zod").ZodObject<{
|
|
111
|
+
field: import("zod").ZodString;
|
|
112
|
+
code: import("zod").ZodEnum<["missing", "wrongType", "invalidValue", "readOnly", "custom"]>;
|
|
113
|
+
message: import("zod").ZodString;
|
|
114
|
+
hint: import("zod").ZodOptional<import("zod").ZodString>;
|
|
115
|
+
suggestedValues: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString, "many">>;
|
|
116
|
+
severity: import("zod").ZodOptional<import("zod").ZodEnum<["error", "warning"]>>;
|
|
117
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
118
|
+
code: "custom" | "missing" | "wrongType" | "invalidValue" | "readOnly";
|
|
119
|
+
message: string;
|
|
120
|
+
field: string;
|
|
121
|
+
hint?: string | undefined;
|
|
122
|
+
suggestedValues?: string[] | undefined;
|
|
123
|
+
severity?: "error" | "warning" | undefined;
|
|
124
|
+
}, {
|
|
125
|
+
code: "custom" | "missing" | "wrongType" | "invalidValue" | "readOnly";
|
|
126
|
+
message: string;
|
|
127
|
+
field: string;
|
|
128
|
+
hint?: string | undefined;
|
|
129
|
+
suggestedValues?: string[] | undefined;
|
|
130
|
+
severity?: "error" | "warning" | undefined;
|
|
131
|
+
}>, "many">;
|
|
132
|
+
nextAction: import("zod").ZodOptional<import("zod").ZodString>;
|
|
133
|
+
timestamp: import("zod").ZodString;
|
|
134
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
135
|
+
issues: {
|
|
136
|
+
code: "custom" | "missing" | "wrongType" | "invalidValue" | "readOnly";
|
|
137
|
+
message: string;
|
|
138
|
+
field: string;
|
|
139
|
+
hint?: string | undefined;
|
|
140
|
+
suggestedValues?: string[] | undefined;
|
|
141
|
+
severity?: "error" | "warning" | undefined;
|
|
142
|
+
}[];
|
|
143
|
+
valid: boolean;
|
|
144
|
+
entityType: string;
|
|
145
|
+
mode: string;
|
|
146
|
+
timestamp: string;
|
|
147
|
+
nextAction?: string | undefined;
|
|
148
|
+
}, {
|
|
149
|
+
issues: {
|
|
150
|
+
code: "custom" | "missing" | "wrongType" | "invalidValue" | "readOnly";
|
|
151
|
+
message: string;
|
|
152
|
+
field: string;
|
|
153
|
+
hint?: string | undefined;
|
|
154
|
+
suggestedValues?: string[] | undefined;
|
|
155
|
+
severity?: "error" | "warning" | undefined;
|
|
156
|
+
}[];
|
|
157
|
+
valid: boolean;
|
|
158
|
+
entityType: string;
|
|
159
|
+
mode: string;
|
|
160
|
+
timestamp: string;
|
|
161
|
+
nextAction?: string | undefined;
|
|
162
|
+
}>;
|
|
163
|
+
export declare const validateEntityLogic: (input: {
|
|
164
|
+
entityType: LinkedInEntityType;
|
|
165
|
+
data: Record<string, unknown>;
|
|
166
|
+
mode: "create" | "update";
|
|
167
|
+
}, _context: import("@cesteral/shared").RequestContext, _sdkContext?: import("@cesteral/shared").SdkContext) => Promise<import("@cesteral/shared").ValidateEntityOutput>;
|
|
168
|
+
//# sourceMappingURL=validate-entity.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-entity.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/validate-entity.tool.ts"],"names":[],"mappings":"AAUA,OAAO,EAAqB,KAAK,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AA6HxF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAsBnB,CAAJ;2BAGF,CAAL;oBAG6B,CAAC;;;;;gBAMzB,CAAJ;2BAGgC,CAAC;oBACN,CAAC;;;;;;;;;gBAOJ,CAAC;2BACmB,CAAA;oBAA4C,CAAC;;;;;;kBAShF,CAAC;;;;;;gBAMwC,CAAC;2BACnB,CAAC;oBACZ,CAAC;;;;;;kBAO0B,CAAC;;;;;;;;;;;;;;;;;;CAQjD,CAAC;AAGH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;EAAiC,CAAC;AACxE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;YA5D3B,CAAJ;uBAGF,CAAL;gBAG6B,CAAC;;;;;YAMzB,CAAJ;uBAGgC,CAAC;gBACN,CAAC;;;;;;;;;YAOJ,CAAC;uBACmB,CAAA;gBAA4C,CAAC;;;;;;;;;;;;YAevC,CAAC;uBACnB,CAAC;gBACZ,CAAC;;;;;;;EAmBiD,CAAC;AAC1E,eAAO,MAAM,mBAAmB;;;;wKAA2B,CAAC"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { getEntityTypeEnum } from "../utils/entity-mapping.js";
|
|
2
|
+
import { createValidateEntityTool } from "@cesteral/shared";
|
|
3
|
+
const ACCOUNT_STATUSES = ["ACTIVE", "CANCELED", "DRAFT", "PENDING_DELETION", "REMOVED"];
|
|
4
|
+
const CAMPAIGN_STATUSES = [
|
|
5
|
+
"ACTIVE",
|
|
6
|
+
"PAUSED",
|
|
7
|
+
"ARCHIVED",
|
|
8
|
+
"COMPLETED",
|
|
9
|
+
"CANCELED",
|
|
10
|
+
"DRAFT",
|
|
11
|
+
"PENDING_DELETION",
|
|
12
|
+
"REMOVED",
|
|
13
|
+
];
|
|
14
|
+
const CREATIVE_STATUSES = [
|
|
15
|
+
"ACTIVE",
|
|
16
|
+
"PAUSED",
|
|
17
|
+
"ARCHIVED",
|
|
18
|
+
"DRAFT",
|
|
19
|
+
"PENDING_DELETION",
|
|
20
|
+
"CANCELED",
|
|
21
|
+
"REMOVED",
|
|
22
|
+
];
|
|
23
|
+
const CAMPAIGN_TYPES = [
|
|
24
|
+
"TEXT_AD",
|
|
25
|
+
"SPONSORED_UPDATES",
|
|
26
|
+
"SPONSORED_INMAILS",
|
|
27
|
+
"DYNAMIC",
|
|
28
|
+
"STANDARD_UPDATE",
|
|
29
|
+
];
|
|
30
|
+
const OBJECTIVE_TYPES = [
|
|
31
|
+
"BRAND_AWARENESS",
|
|
32
|
+
"WEBSITE_VISIT",
|
|
33
|
+
"ENGAGEMENT",
|
|
34
|
+
"VIDEO_VIEW",
|
|
35
|
+
"LEAD_GENERATION",
|
|
36
|
+
"WEBSITE_CONVERSION",
|
|
37
|
+
"JOB_APPLICANT",
|
|
38
|
+
"TALENT_LEAD",
|
|
39
|
+
];
|
|
40
|
+
const CONVERSION_TYPES = [
|
|
41
|
+
"ADD_TO_CART",
|
|
42
|
+
"DOWNLOAD",
|
|
43
|
+
"INSTALL",
|
|
44
|
+
"KEY_PAGE_VIEW",
|
|
45
|
+
"LEAD",
|
|
46
|
+
"PURCHASE",
|
|
47
|
+
"SIGN_UP",
|
|
48
|
+
"OTHER",
|
|
49
|
+
];
|
|
50
|
+
const ACCOUNT_TYPES = ["BUSINESS", "ENTERPRISE"];
|
|
51
|
+
const REQUIRED_FIELDS_CREATE = {
|
|
52
|
+
adAccount: [
|
|
53
|
+
{ field: "name", expectedType: "string" },
|
|
54
|
+
{ field: "type", expectedType: "string", hint: "Account type", suggestedValues: ACCOUNT_TYPES },
|
|
55
|
+
{ field: "currency", expectedType: "string", hint: "ISO 4217 currency code (e.g., USD)" },
|
|
56
|
+
],
|
|
57
|
+
campaignGroup: [
|
|
58
|
+
{ field: "name", expectedType: "string" },
|
|
59
|
+
{
|
|
60
|
+
field: "account",
|
|
61
|
+
expectedType: "string",
|
|
62
|
+
hint: "Ad account URN (e.g., urn:li:sponsoredAccount:123)",
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
field: "status",
|
|
66
|
+
expectedType: "string",
|
|
67
|
+
hint: "Campaign group lifecycle status",
|
|
68
|
+
suggestedValues: ACCOUNT_STATUSES,
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
campaign: [
|
|
72
|
+
{ field: "name", expectedType: "string" },
|
|
73
|
+
{ field: "campaignGroup", expectedType: "string", hint: "Campaign group URN" },
|
|
74
|
+
{ field: "account", expectedType: "string", hint: "Ad account URN" },
|
|
75
|
+
{
|
|
76
|
+
field: "type",
|
|
77
|
+
expectedType: "string",
|
|
78
|
+
hint: "Campaign creative format",
|
|
79
|
+
suggestedValues: CAMPAIGN_TYPES,
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
field: "objectiveType",
|
|
83
|
+
expectedType: "string",
|
|
84
|
+
hint: "Campaign optimization objective",
|
|
85
|
+
suggestedValues: OBJECTIVE_TYPES,
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
field: "status",
|
|
89
|
+
expectedType: "string",
|
|
90
|
+
hint: "Campaign lifecycle status",
|
|
91
|
+
suggestedValues: CAMPAIGN_STATUSES,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
creative: [
|
|
95
|
+
{ field: "campaign", expectedType: "string", hint: "Campaign URN" },
|
|
96
|
+
{
|
|
97
|
+
field: "status",
|
|
98
|
+
expectedType: "string",
|
|
99
|
+
hint: "Creative lifecycle status",
|
|
100
|
+
suggestedValues: CREATIVE_STATUSES,
|
|
101
|
+
},
|
|
102
|
+
{ field: "reference", expectedType: "string", hint: "Content reference URN" },
|
|
103
|
+
],
|
|
104
|
+
conversionRule: [
|
|
105
|
+
{ field: "name", expectedType: "string" },
|
|
106
|
+
{
|
|
107
|
+
field: "type",
|
|
108
|
+
expectedType: "string",
|
|
109
|
+
hint: "Conversion event type",
|
|
110
|
+
suggestedValues: CONVERSION_TYPES,
|
|
111
|
+
},
|
|
112
|
+
{ field: "account", expectedType: "string", hint: "Ad account URN" },
|
|
113
|
+
{
|
|
114
|
+
field: "status",
|
|
115
|
+
expectedType: "string",
|
|
116
|
+
hint: "Conversion rule status",
|
|
117
|
+
suggestedValues: ["ACTIVE", "PAUSED"],
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
const READ_ONLY_FIELDS = ["id", "changeAuditStamps", "created", "lastModified", "review"];
|
|
122
|
+
export const validateEntityTool = createValidateEntityTool({
|
|
123
|
+
toolName: "linkedin_validate_entity",
|
|
124
|
+
toolTitle: "LinkedIn Ads Entity Validation (Client-Side)",
|
|
125
|
+
toolDescription: `Validate an entity payload against known LinkedIn Ads requirements without calling the API.
|
|
126
|
+
|
|
127
|
+
**Supported entity types:** ${getEntityTypeEnum().join(", ")}
|
|
128
|
+
|
|
129
|
+
Checks required fields, data types, and common configuration mistakes.
|
|
130
|
+
The LinkedIn API may still reject payloads for business-rule reasons.`,
|
|
131
|
+
entityTypeEnum: getEntityTypeEnum(),
|
|
132
|
+
rulesByEntity: REQUIRED_FIELDS_CREATE,
|
|
133
|
+
readOnlyFields: READ_ONLY_FIELDS,
|
|
134
|
+
extraValidate: ({ mode, data, issues }) => {
|
|
135
|
+
if (mode === "create") {
|
|
136
|
+
for (const field of ["account", "campaignGroup", "campaign"]) {
|
|
137
|
+
const value = data[field];
|
|
138
|
+
if (value && typeof value === "string" && !value.startsWith("urn:li:")) {
|
|
139
|
+
issues.push({
|
|
140
|
+
field,
|
|
141
|
+
code: "invalidValue",
|
|
142
|
+
message: `Field "${field}" value "${value}" doesn't look like a LinkedIn URN. Expected format: urn:li:{type}:{id}`,
|
|
143
|
+
severity: "warning",
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (mode === "update" && Object.keys(data).length === 0) {
|
|
149
|
+
issues.push({
|
|
150
|
+
field: "data",
|
|
151
|
+
code: "custom",
|
|
152
|
+
message: "Update payload must contain at least one field to update",
|
|
153
|
+
severity: "error",
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
for (const field of ["dailyBudget", "totalBudget", "unitCost"]) {
|
|
157
|
+
const value = data[field];
|
|
158
|
+
if (value !== undefined && typeof value === "object" && value !== null) {
|
|
159
|
+
const budgetObj = value;
|
|
160
|
+
if (!budgetObj.amount || !budgetObj.currencyCode) {
|
|
161
|
+
issues.push({
|
|
162
|
+
field,
|
|
163
|
+
code: "wrongType",
|
|
164
|
+
message: `Field "${field}" should be an object with "amount" (string) and "currencyCode" (e.g., USD). Got: ${JSON.stringify(value)}`,
|
|
165
|
+
severity: "warning",
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
inputExamples: [
|
|
172
|
+
{
|
|
173
|
+
label: "Valid campaign create",
|
|
174
|
+
input: {
|
|
175
|
+
entityType: "campaign",
|
|
176
|
+
mode: "create",
|
|
177
|
+
data: {
|
|
178
|
+
name: "Q1 LinkedIn Campaign",
|
|
179
|
+
campaignGroup: "urn:li:sponsoredCampaignGroup:987654321",
|
|
180
|
+
account: "urn:li:sponsoredAccount:123456789",
|
|
181
|
+
type: "SPONSORED_UPDATES",
|
|
182
|
+
objectiveType: "BRAND_AWARENESS",
|
|
183
|
+
status: "DRAFT",
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
label: "Missing required fields (campaign group)",
|
|
189
|
+
input: {
|
|
190
|
+
entityType: "campaignGroup",
|
|
191
|
+
mode: "create",
|
|
192
|
+
data: { name: "Test Campaign Group" },
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
});
|
|
197
|
+
export const ValidateEntityInputSchema = validateEntityTool.inputSchema;
|
|
198
|
+
export const ValidateEntityOutputSchema = validateEntityTool.outputSchema;
|
|
199
|
+
export const validateEntityLogic = validateEntityTool.logic;
|
|
200
|
+
//# sourceMappingURL=validate-entity.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-entity.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/validate-entity.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp-server/tools/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type LinkedInEntityType = "adAccount" | "campaignGroup" | "campaign" | "creative" | "conversionRule";
|
|
2
|
+
export interface LinkedInEntityConfig {
|
|
3
|
+
apiPath: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
defaultFields: string[];
|
|
6
|
+
listScopingParam?: "accounts[0]" | "account";
|
|
7
|
+
}
|
|
8
|
+
export declare function getEntityConfig(entityType: LinkedInEntityType): LinkedInEntityConfig;
|
|
9
|
+
export declare function getSupportedEntityTypes(): LinkedInEntityType[];
|
|
10
|
+
export declare function getEntityTypeEnum(): [string, ...string[]];
|
|
11
|
+
export declare const ACCOUNT_SCOPED_ENTITY_TYPES: LinkedInEntityType[];
|
|
12
|
+
export declare function isAccountScopedEntity(entityType: LinkedInEntityType): boolean;
|
|
13
|
+
//# sourceMappingURL=entity-mapping.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-mapping.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/entity-mapping.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,kBAAkB,GAC1B,WAAW,GACX,eAAe,GACf,UAAU,GACV,UAAU,GACV,gBAAgB,CAAC;AAErB,MAAM,WAAW,oBAAoB;IAEnC,OAAO,EAAE,MAAM,CAAC;IAEhB,WAAW,EAAE,MAAM,CAAC;IAEpB,aAAa,EAAE,MAAM,EAAE,CAAC;IAOxB,gBAAgB,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAC9C;AA+CD,wBAAgB,eAAe,CAAC,UAAU,EAAE,kBAAkB,GAAG,oBAAoB,CASpF;AAED,wBAAgB,uBAAuB,IAAI,kBAAkB,EAAE,CAE9D;AAED,wBAAgB,iBAAiB,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAGzD;AAKD,eAAO,MAAM,2BAA2B,EAAE,kBAAkB,EAK3D,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAE7E"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { JsonRpcErrorCode, McpError } from "@cesteral/shared";
|
|
2
|
+
const ENTITY_CONFIGS = {
|
|
3
|
+
adAccount: {
|
|
4
|
+
apiPath: "/v2/adAccounts",
|
|
5
|
+
displayName: "Ad Account",
|
|
6
|
+
defaultFields: ["id", "name", "status", "currency", "type", "reference"],
|
|
7
|
+
},
|
|
8
|
+
campaignGroup: {
|
|
9
|
+
apiPath: "/v2/adCampaignGroups",
|
|
10
|
+
displayName: "Campaign Group",
|
|
11
|
+
defaultFields: ["id", "name", "status", "account", "totalBudget", "runSchedule"],
|
|
12
|
+
listScopingParam: "account",
|
|
13
|
+
},
|
|
14
|
+
campaign: {
|
|
15
|
+
apiPath: "/v2/adCampaigns",
|
|
16
|
+
displayName: "Campaign",
|
|
17
|
+
defaultFields: [
|
|
18
|
+
"id",
|
|
19
|
+
"name",
|
|
20
|
+
"status",
|
|
21
|
+
"campaignGroup",
|
|
22
|
+
"type",
|
|
23
|
+
"objectiveType",
|
|
24
|
+
"dailyBudget",
|
|
25
|
+
"totalBudget",
|
|
26
|
+
"bidType",
|
|
27
|
+
"unitCost",
|
|
28
|
+
"runSchedule",
|
|
29
|
+
],
|
|
30
|
+
listScopingParam: "accounts[0]",
|
|
31
|
+
},
|
|
32
|
+
creative: {
|
|
33
|
+
apiPath: "/v2/adCreatives",
|
|
34
|
+
displayName: "Creative",
|
|
35
|
+
defaultFields: ["id", "status", "campaign", "reference", "review"],
|
|
36
|
+
listScopingParam: "accounts[0]",
|
|
37
|
+
},
|
|
38
|
+
conversionRule: {
|
|
39
|
+
apiPath: "/v2/conversions",
|
|
40
|
+
displayName: "Conversion Rule",
|
|
41
|
+
defaultFields: ["id", "name", "type", "account", "status", "urlRules"],
|
|
42
|
+
listScopingParam: "account",
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
export function getEntityConfig(entityType) {
|
|
46
|
+
const config = ENTITY_CONFIGS[entityType];
|
|
47
|
+
if (!config) {
|
|
48
|
+
throw new McpError(JsonRpcErrorCode.InvalidParams, `Unknown LinkedIn entity type: ${entityType}`);
|
|
49
|
+
}
|
|
50
|
+
return config;
|
|
51
|
+
}
|
|
52
|
+
export function getSupportedEntityTypes() {
|
|
53
|
+
return Object.keys(ENTITY_CONFIGS);
|
|
54
|
+
}
|
|
55
|
+
export function getEntityTypeEnum() {
|
|
56
|
+
const types = getSupportedEntityTypes();
|
|
57
|
+
return types;
|
|
58
|
+
}
|
|
59
|
+
export const ACCOUNT_SCOPED_ENTITY_TYPES = [
|
|
60
|
+
"campaignGroup",
|
|
61
|
+
"campaign",
|
|
62
|
+
"creative",
|
|
63
|
+
"conversionRule",
|
|
64
|
+
];
|
|
65
|
+
export function isAccountScopedEntity(entityType) {
|
|
66
|
+
return ACCOUNT_SCOPED_ENTITY_TYPES.includes(entityType);
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=entity-mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-mapping.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/entity-mapping.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAiC9D,MAAM,cAAc,GAAqD;IACvE,SAAS,EAAE;QACT,OAAO,EAAE,gBAAgB;QACzB,WAAW,EAAE,YAAY;QACzB,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC;KAEzE;IACD,aAAa,EAAE;QACb,OAAO,EAAE,sBAAsB;QAC/B,WAAW,EAAE,gBAAgB;QAC7B,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC;QAChF,gBAAgB,EAAE,SAAS;KAC5B;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,iBAAiB;QAC1B,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE;YACb,IAAI;YACJ,MAAM;YACN,QAAQ;YACR,eAAe;YACf,MAAM;YACN,eAAe;YACf,aAAa;YACb,aAAa;YACb,SAAS;YACT,UAAU;YACV,aAAa;SACd;QACD,gBAAgB,EAAE,aAAa;KAChC;IACD,QAAQ,EAAE;QACR,OAAO,EAAE,iBAAiB;QAC1B,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,CAAC;QAClE,gBAAgB,EAAE,aAAa;KAChC;IACD,cAAc,EAAE;QACd,OAAO,EAAE,iBAAiB;QAC1B,WAAW,EAAE,iBAAiB;QAC9B,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC;QACtE,gBAAgB,EAAE,SAAS;KAC5B;CACF,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,UAA8B;IAC5D,MAAM,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,QAAQ,CAChB,gBAAgB,CAAC,aAAa,EAC9B,iCAAiC,UAAU,EAAE,CAC9C,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,cAAc,CAAyB,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,KAAK,GAAG,uBAAuB,EAAE,CAAC;IACxC,OAAO,KAA8B,CAAC;AACxC,CAAC;AAKD,MAAM,CAAC,MAAM,2BAA2B,GAAyB;IAC/D,eAAe;IACf,UAAU;IACV,UAAU;IACV,gBAAgB;CACjB,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,UAA8B;IAClE,OAAO,2BAA2B,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface LinkedInRegisterUploadResponse {
|
|
2
|
+
value?: {
|
|
3
|
+
uploadMechanism?: {
|
|
4
|
+
"com.linkedin.digitalmedia.uploading.MediaUploadHttpRequest"?: {
|
|
5
|
+
uploadUrl?: string;
|
|
6
|
+
headers?: Record<string, string>;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
asset?: string;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=media-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-types.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/media-types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,8BAA8B;IAC7C,KAAK,CAAC,EAAE;QACN,eAAe,CAAC,EAAE;YAChB,4DAA4D,CAAC,EAAE;gBAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;gBACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aAClC,CAAC;SACH,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-types.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/media-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-session.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/resolve-session.ts"],"names":[],"mappings":"AAQA,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAMnD,wBAAgB,sBAAsB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,eAAe,CAE/E"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { resolveSessionServicesFromStore } from "@cesteral/shared";
|
|
2
|
+
import { sessionServiceStore } from "../../../services/session-services.js";
|
|
3
|
+
export function resolveSessionServices(sdkContext) {
|
|
4
|
+
return resolveSessionServicesFromStore(sessionServiceStore, sdkContext);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=resolve-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-session.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/utils/resolve-session.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,+BAA+B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAwB,MAAM,uCAAuC,CAAC;AAOlG,MAAM,UAAU,sBAAsB,CAAC,UAAuB;IAC5D,OAAO,+BAA+B,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Logger } from "pino";
|
|
2
|
+
export declare const createMcpHttpServer: (config: {
|
|
3
|
+
serviceName: string;
|
|
4
|
+
port: number;
|
|
5
|
+
otelServiceName: string;
|
|
6
|
+
mcpAuthMode: "linkedin-bearer" | "jwt" | "none";
|
|
7
|
+
linkedinApiBaseUrl: string;
|
|
8
|
+
linkedinApiVersion: string;
|
|
9
|
+
linkedinRateLimitPerMinute: number;
|
|
10
|
+
host: string;
|
|
11
|
+
nodeEnv: "development" | "production" | "test";
|
|
12
|
+
mcpStatefulSessionTimeoutMs: number;
|
|
13
|
+
logLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
14
|
+
mcpLogLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
15
|
+
otelEnabled: boolean;
|
|
16
|
+
linkedinAccessToken?: string | undefined;
|
|
17
|
+
linkedinClientId?: string | undefined;
|
|
18
|
+
linkedinClientSecret?: string | undefined;
|
|
19
|
+
linkedinRefreshToken?: string | undefined;
|
|
20
|
+
mcpAuthSecretKey?: string | undefined;
|
|
21
|
+
mcpAllowedOrigins?: string | undefined;
|
|
22
|
+
otelExporterOtlpTracesEndpoint?: string | undefined;
|
|
23
|
+
otelExporterOtlpMetricsEndpoint?: string | undefined;
|
|
24
|
+
gcsBucketName?: string | undefined;
|
|
25
|
+
}, logger: Logger) => ReturnType<typeof import("@cesteral/shared").createMcpHttpTransport>, startHttpServer: (config: {
|
|
26
|
+
serviceName: string;
|
|
27
|
+
port: number;
|
|
28
|
+
otelServiceName: string;
|
|
29
|
+
mcpAuthMode: "linkedin-bearer" | "jwt" | "none";
|
|
30
|
+
linkedinApiBaseUrl: string;
|
|
31
|
+
linkedinApiVersion: string;
|
|
32
|
+
linkedinRateLimitPerMinute: number;
|
|
33
|
+
host: string;
|
|
34
|
+
nodeEnv: "development" | "production" | "test";
|
|
35
|
+
mcpStatefulSessionTimeoutMs: number;
|
|
36
|
+
logLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
37
|
+
mcpLogLevel: "debug" | "info" | "notice" | "warning" | "error";
|
|
38
|
+
otelEnabled: boolean;
|
|
39
|
+
linkedinAccessToken?: string | undefined;
|
|
40
|
+
linkedinClientId?: string | undefined;
|
|
41
|
+
linkedinClientSecret?: string | undefined;
|
|
42
|
+
linkedinRefreshToken?: string | undefined;
|
|
43
|
+
mcpAuthSecretKey?: string | undefined;
|
|
44
|
+
mcpAllowedOrigins?: string | undefined;
|
|
45
|
+
otelExporterOtlpTracesEndpoint?: string | undefined;
|
|
46
|
+
otelExporterOtlpMetricsEndpoint?: string | undefined;
|
|
47
|
+
gcsBucketName?: string | undefined;
|
|
48
|
+
}, logger: Logger) => Promise<import("@cesteral/shared").McpHttpServer>;
|
|
49
|
+
//# sourceMappingURL=streamable-http-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamable-http-transport.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/transports/streamable-http-transport.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AA+InC,eAAO,MAAQ,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;4FAAE,eAAe;;;;;;;;;;;;;;;;;;;;;;;uEACS,CAAC"}
|