@adport/mcp 0.5.2 → 0.6.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/dist/bin.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  assembleRuntime,
4
4
  runStdioServer
5
- } from "./chunk-6RBLUIBN.js";
5
+ } from "./chunk-XJQV7GEV.js";
6
6
 
7
7
  // src/bin.ts
8
8
  var runtime = await assembleRuntime(process.argv.includes("--demo") ? { includeMock: true } : {});
@@ -8,11 +8,16 @@ import { createTikTokModule } from "@adport/provider-tiktok";
8
8
  import { createAppleModule } from "@adport/provider-apple";
9
9
  import { createMicrosoftModule } from "@adport/provider-microsoft";
10
10
  import { createRedditModule } from "@adport/provider-reddit";
11
+ import { createSnapchatModule } from "@adport/provider-snapchat";
12
+ import { createSpotifyModule } from "@adport/provider-spotify";
13
+ import { createPinterestModule } from "@adport/provider-pinterest";
14
+ import { createLinkedInModule } from "@adport/provider-linkedin";
15
+ import { createXModule } from "@adport/provider-x";
11
16
 
12
17
  // package.json
13
18
  var package_default = {
14
19
  name: "@adport/mcp",
15
- version: "0.5.2",
20
+ version: "0.6.0",
16
21
  description: "adport MCP server \u2014 the open control plane for paid media",
17
22
  license: "Apache-2.0",
18
23
  type: "module",
@@ -41,6 +46,11 @@ var package_default = {
41
46
  "@adport/provider-meta": "workspace:*",
42
47
  "@adport/provider-microsoft": "workspace:*",
43
48
  "@adport/provider-reddit": "workspace:*",
49
+ "@adport/provider-snapchat": "workspace:*",
50
+ "@adport/provider-spotify": "workspace:*",
51
+ "@adport/provider-pinterest": "workspace:*",
52
+ "@adport/provider-linkedin": "workspace:*",
53
+ "@adport/provider-x": "workspace:*",
44
54
  "@adport/provider-tiktok": "workspace:*",
45
55
  "@modelcontextprotocol/sdk": "^1.12.0",
46
56
  zod: "^4.4.3"
@@ -54,22 +64,29 @@ var package_default = {
54
64
  };
55
65
 
56
66
  // src/index.ts
57
- var PROVIDER_IDS = ["google", "meta", "tiktok", "apple", "microsoft", "reddit"];
67
+ var PROVIDER_IDS = ["google", "meta", "tiktok", "apple", "microsoft", "reddit", "snapchat", "spotify", "pinterest", "linkedin", "x"];
68
+ var DEFAULT_MCP_ICONS = [{
69
+ src: "https://app.adport.dev/icon.svg?brand=orange-dot-v2",
70
+ mimeType: "image/svg+xml",
71
+ sizes: ["any"]
72
+ }];
58
73
  async function assembleRuntime(options = {}) {
59
74
  const store = new CredentialStore();
60
75
  const modules = [];
61
76
  const includeMock = options.includeMock ?? process.env.ADPORT_DEMO === "true";
62
77
  if (!includeMock) {
63
- for (const factory of [createGoogleModule, createMetaModule, createTikTokModule, createAppleModule, createMicrosoftModule, createRedditModule]) {
78
+ for (const factory of [createGoogleModule, createMetaModule, createTikTokModule, createAppleModule, createMicrosoftModule, createRedditModule, createSnapchatModule, createSpotifyModule, createPinterestModule, createLinkedInModule, createXModule]) {
64
79
  const module = await factory(store);
65
80
  if (module) modules.push(module);
66
81
  }
67
82
  }
68
83
  return createContext({ providerModules: modules, includeMock });
69
84
  }
70
- function createMcpServer({ runtime, name = "adport", version = package_default.version }) {
71
- const server = new McpServer({ name, version });
85
+ function createMcpServer({ runtime, name = "adport", version = package_default.version, icons = DEFAULT_MCP_ICONS, scopes }) {
86
+ const server = new McpServer({ name, version, ...icons ? { icons } : {} });
72
87
  for (const tool of runtime.registry.list()) {
88
+ const requiredScope = tool.annotations.readOnly ? "tools:read" : "tools:write";
89
+ if (scopes && !scopes.includes(requiredScope)) continue;
73
90
  server.registerTool(
74
91
  tool.name,
75
92
  {
@@ -77,7 +94,8 @@ function createMcpServer({ runtime, name = "adport", version = package_default.v
77
94
  inputSchema: tool.input.shape,
78
95
  annotations: {
79
96
  readOnlyHint: tool.annotations.readOnly ?? false,
80
- destructiveHint: tool.annotations.destructive ?? false
97
+ destructiveHint: tool.annotations.destructive ?? false,
98
+ openWorldHint: tool.annotations.openWorld ?? false
81
99
  }
82
100
  },
83
101
  async (args) => {
@@ -111,4 +129,4 @@ export {
111
129
  createMcpServer,
112
130
  runStdioServer
113
131
  };
114
- //# sourceMappingURL=chunk-6RBLUIBN.js.map
132
+ //# sourceMappingURL=chunk-XJQV7GEV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { AdportError, CredentialStore, createContext, type AdportRuntime, type ProviderModule } from '@adport/core';\nimport { createGoogleModule } from '@adport/provider-google';\nimport { createMetaModule } from '@adport/provider-meta';\nimport { createTikTokModule } from '@adport/provider-tiktok';\nimport { createAppleModule } from '@adport/provider-apple';\nimport { createMicrosoftModule } from '@adport/provider-microsoft';\nimport { createRedditModule } from '@adport/provider-reddit';\nimport { createSnapchatModule } from '@adport/provider-snapchat';\nimport { createSpotifyModule } from '@adport/provider-spotify';\nimport { createPinterestModule } from '@adport/provider-pinterest';\nimport { createLinkedInModule } from '@adport/provider-linkedin';\nimport { createXModule } from '@adport/provider-x';\nimport packageJson from '../package.json';\n\nexport const PROVIDER_IDS = ['google', 'meta', 'tiktok', 'apple', 'microsoft', 'reddit', 'snapchat', 'spotify', 'pinterest', 'linkedin', 'x'] as const;\n\nconst DEFAULT_MCP_ICONS = [{\n src: 'https://app.adport.dev/icon.svg?brand=orange-dot-v2',\n mimeType: 'image/svg+xml',\n sizes: ['any'],\n}];\n\n/**\n * Standard runtime assembly: real providers whose credentials exist. Mock data\n * is opt-in so a live runtime never silently substitutes synthetic accounts.\n */\nexport interface AssembleRuntimeOptions {\n includeMock?: boolean;\n}\n\nexport async function assembleRuntime(options: AssembleRuntimeOptions = {}): Promise<AdportRuntime> {\n const store = new CredentialStore();\n const modules: ProviderModule[] = [];\n const includeMock = options.includeMock ?? process.env.ADPORT_DEMO === 'true';\n if (!includeMock) {\n for (const factory of [createGoogleModule, createMetaModule, createTikTokModule, createAppleModule, createMicrosoftModule, createRedditModule, createSnapchatModule, createSpotifyModule, createPinterestModule, createLinkedInModule, createXModule]) {\n const module = await factory(store);\n if (module) modules.push(module);\n }\n }\n return createContext({ providerModules: modules, includeMock });\n}\n\nexport interface CreateServerOptions {\n runtime: AdportRuntime;\n name?: string;\n version?: string;\n /** Brand icons advertised to MCP clients during initialization. */\n icons?: Array<{ src: string; mimeType?: string; sizes?: string[] }>;\n /** When set by a remote transport, only register tools authorized by this key. */\n scopes?: readonly string[];\n}\n\n/**\n * Thin adapter: every tool in the shared registry becomes an MCP tool.\n * No tool logic lives here — see the \"one tool-definition layer\" principle.\n */\nexport function createMcpServer({ runtime, name = 'adport', version = packageJson.version, icons = DEFAULT_MCP_ICONS, scopes }: CreateServerOptions): McpServer {\n const server = new McpServer({ name, version, ...(icons ? { icons } : {}) });\n for (const tool of runtime.registry.list()) {\n const requiredScope = tool.annotations.readOnly ? 'tools:read' : 'tools:write';\n if (scopes && !scopes.includes(requiredScope)) continue;\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: tool.input.shape,\n annotations: {\n readOnlyHint: tool.annotations.readOnly ?? false,\n destructiveHint: tool.annotations.destructive ?? false,\n openWorldHint: tool.annotations.openWorld ?? false,\n },\n },\n async (args: Record<string, unknown>) => {\n try {\n const result = await runtime.registry.call(tool.name, args, runtime.ctx);\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] };\n } catch (err) {\n const payload =\n err instanceof AdportError\n ? err.toJSON()\n : { error: 'INTERNAL', message: err instanceof Error ? err.message : String(err) };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(payload, null, 2) }],\n isError: true,\n };\n }\n },\n );\n }\n return server;\n}\n\nexport async function runStdioServer(runtime: AdportRuntime, version?: string): Promise<void> {\n const server = createMcpServer({ runtime, version });\n await server.connect(new StdioServerTransport());\n // stdout is the protocol channel; stderr is for humans.\n console.error(`adport MCP server on stdio (${runtime.registry.list().length} tools, policy: ${runtime.policySource})`);\n if (runtime.ctx.providers.list().length === 0) {\n console.error('No ad providers connected. Run `adport connect <provider>` or restart with `--demo` for synthetic mock data.');\n }\n}\n","{\n \"name\": \"@adport/mcp\",\n \"version\": \"0.6.0\",\n \"description\": \"adport MCP server — the open control plane for paid media\",\n \"license\": \"Apache-2.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"bin\": {\n \"adport-mcp\": \"./dist/bin.js\"\n },\n \"files\": [\"dist\"],\n \"scripts\": {\n \"build\": \"tsup src/index.ts src/bin.ts --format esm --dts --sourcemap --clean\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"dependencies\": {\n \"@adport/core\": \"workspace:*\",\n \"@adport/provider-apple\": \"workspace:*\",\n \"@adport/provider-google\": \"workspace:*\",\n \"@adport/provider-meta\": \"workspace:*\",\n \"@adport/provider-microsoft\": \"workspace:*\",\n \"@adport/provider-reddit\": \"workspace:*\",\n \"@adport/provider-snapchat\": \"workspace:*\",\n \"@adport/provider-spotify\": \"workspace:*\",\n \"@adport/provider-pinterest\": \"workspace:*\",\n \"@adport/provider-linkedin\": \"workspace:*\",\n \"@adport/provider-x\": \"workspace:*\",\n \"@adport/provider-tiktok\": \"workspace:*\",\n \"@modelcontextprotocol/sdk\": \"^1.12.0\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.1.2\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.8.0\",\n \"vitest\": \"^4.1.10\"\n }\n}\n"],"mappings":";AAAA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AACrC,SAAS,aAAa,iBAAiB,qBAA8D;AACrG,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,6BAA6B;AACtC,SAAS,0BAA0B;AACnC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AACpC,SAAS,6BAA6B;AACtC,SAAS,4BAA4B;AACrC,SAAS,qBAAqB;;;ACb9B;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,SAAW;AAAA,EACX,MAAQ;AAAA,EACR,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,SAAW;AAAA,IACT,KAAK;AAAA,MACH,OAAS;AAAA,MACT,QAAU;AAAA,IACZ;AAAA,EACF;AAAA,EACA,KAAO;AAAA,IACL,cAAc;AAAA,EAChB;AAAA,EACA,OAAS,CAAC,MAAM;AAAA,EAChB,SAAW;AAAA,IACT,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,WAAa;AAAA,IACb,OAAS;AAAA,EACX;AAAA,EACA,cAAgB;AAAA,IACd,gBAAgB;AAAA,IAChB,0BAA0B;AAAA,IAC1B,2BAA2B;AAAA,IAC3B,yBAAyB;AAAA,IACzB,8BAA8B;AAAA,IAC9B,2BAA2B;AAAA,IAC3B,6BAA6B;AAAA,IAC7B,4BAA4B;AAAA,IAC5B,8BAA8B;AAAA,IAC9B,6BAA6B;AAAA,IAC7B,sBAAsB;AAAA,IACtB,2BAA2B;AAAA,IAC3B,6BAA6B;AAAA,IAC7B,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,eAAe;AAAA,IACf,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AACF;;;AD9BO,IAAM,eAAe,CAAC,UAAU,QAAQ,UAAU,SAAS,aAAa,UAAU,YAAY,WAAW,aAAa,YAAY,GAAG;AAE5I,IAAM,oBAAoB,CAAC;AAAA,EACzB,KAAK;AAAA,EACL,UAAU;AAAA,EACV,OAAO,CAAC,KAAK;AACf,CAAC;AAUD,eAAsB,gBAAgB,UAAkC,CAAC,GAA2B;AAClG,QAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAM,UAA4B,CAAC;AACnC,QAAM,cAAc,QAAQ,eAAe,QAAQ,IAAI,gBAAgB;AACvE,MAAI,CAAC,aAAa;AAChB,eAAW,WAAW,CAAC,oBAAoB,kBAAkB,oBAAoB,mBAAmB,uBAAuB,oBAAoB,sBAAsB,qBAAqB,uBAAuB,sBAAsB,aAAa,GAAG;AACrP,YAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,UAAI,OAAQ,SAAQ,KAAK,MAAM;AAAA,IACjC;AAAA,EACF;AACA,SAAO,cAAc,EAAE,iBAAiB,SAAS,YAAY,CAAC;AAChE;AAgBO,SAAS,gBAAgB,EAAE,SAAS,OAAO,UAAU,UAAU,gBAAY,SAAS,QAAQ,mBAAmB,OAAO,GAAmC;AAC9J,QAAM,SAAS,IAAI,UAAU,EAAE,MAAM,SAAS,GAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,EAAG,CAAC;AAC3E,aAAW,QAAQ,QAAQ,SAAS,KAAK,GAAG;AAC1C,UAAM,gBAAgB,KAAK,YAAY,WAAW,eAAe;AACjE,QAAI,UAAU,CAAC,OAAO,SAAS,aAAa,EAAG;AAC/C,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,QACE,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK,MAAM;AAAA,QACxB,aAAa;AAAA,UACX,cAAc,KAAK,YAAY,YAAY;AAAA,UAC3C,iBAAiB,KAAK,YAAY,eAAe;AAAA,UACjD,eAAe,KAAK,YAAY,aAAa;AAAA,QAC/C;AAAA,MACF;AAAA,MACA,OAAO,SAAkC;AACvC,YAAI;AACF,gBAAM,SAAS,MAAM,QAAQ,SAAS,KAAK,KAAK,MAAM,MAAM,QAAQ,GAAG;AACvE,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,EAAE,CAAC,EAAE;AAAA,QACvF,SAAS,KAAK;AACZ,gBAAM,UACJ,eAAe,cACX,IAAI,OAAO,IACX,EAAE,OAAO,YAAY,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE;AACrF,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,KAAK,UAAU,SAAS,MAAM,CAAC,EAAE,CAAC;AAAA,YAC3E,SAAS;AAAA,UACX;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,eAAe,SAAwB,SAAiC;AAC5F,QAAM,SAAS,gBAAgB,EAAE,SAAS,QAAQ,CAAC;AACnD,QAAM,OAAO,QAAQ,IAAI,qBAAqB,CAAC;AAE/C,UAAQ,MAAM,+BAA+B,QAAQ,SAAS,KAAK,EAAE,MAAM,mBAAmB,QAAQ,YAAY,GAAG;AACrH,MAAI,QAAQ,IAAI,UAAU,KAAK,EAAE,WAAW,GAAG;AAC7C,YAAQ,MAAM,8GAA8G;AAAA,EAC9H;AACF;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { AdportRuntime } from '@adport/core';
3
3
 
4
- declare const PROVIDER_IDS: readonly ["google", "meta", "tiktok", "apple", "microsoft", "reddit"];
4
+ declare const PROVIDER_IDS: readonly ["google", "meta", "tiktok", "apple", "microsoft", "reddit", "snapchat", "spotify", "pinterest", "linkedin", "x"];
5
5
  /**
6
6
  * Standard runtime assembly: real providers whose credentials exist. Mock data
7
7
  * is opt-in so a live runtime never silently substitutes synthetic accounts.
@@ -14,12 +14,20 @@ interface CreateServerOptions {
14
14
  runtime: AdportRuntime;
15
15
  name?: string;
16
16
  version?: string;
17
+ /** Brand icons advertised to MCP clients during initialization. */
18
+ icons?: Array<{
19
+ src: string;
20
+ mimeType?: string;
21
+ sizes?: string[];
22
+ }>;
23
+ /** When set by a remote transport, only register tools authorized by this key. */
24
+ scopes?: readonly string[];
17
25
  }
18
26
  /**
19
27
  * Thin adapter: every tool in the shared registry becomes an MCP tool.
20
28
  * No tool logic lives here — see the "one tool-definition layer" principle.
21
29
  */
22
- declare function createMcpServer({ runtime, name, version }: CreateServerOptions): McpServer;
30
+ declare function createMcpServer({ runtime, name, version, icons, scopes }: CreateServerOptions): McpServer;
23
31
  declare function runStdioServer(runtime: AdportRuntime, version?: string): Promise<void>;
24
32
 
25
33
  export { type AssembleRuntimeOptions, type CreateServerOptions, PROVIDER_IDS, assembleRuntime, createMcpServer, runStdioServer };
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  assembleRuntime,
4
4
  createMcpServer,
5
5
  runStdioServer
6
- } from "./chunk-6RBLUIBN.js";
6
+ } from "./chunk-XJQV7GEV.js";
7
7
  export {
8
8
  PROVIDER_IDS,
9
9
  assembleRuntime,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adport/mcp",
3
- "version": "0.5.2",
3
+ "version": "0.6.0",
4
4
  "description": "adport MCP server — the open control plane for paid media",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -21,13 +21,18 @@
21
21
  "dependencies": {
22
22
  "@modelcontextprotocol/sdk": "^1.12.0",
23
23
  "zod": "^4.4.3",
24
- "@adport/provider-google": "0.5.2",
25
- "@adport/provider-microsoft": "0.5.2",
26
- "@adport/provider-meta": "0.5.2",
27
- "@adport/core": "0.5.2",
28
- "@adport/provider-tiktok": "0.5.2",
29
- "@adport/provider-reddit": "0.5.2",
30
- "@adport/provider-apple": "0.5.2"
24
+ "@adport/provider-apple": "0.6.0",
25
+ "@adport/provider-google": "0.6.0",
26
+ "@adport/provider-meta": "0.6.0",
27
+ "@adport/core": "0.6.0",
28
+ "@adport/provider-microsoft": "0.6.0",
29
+ "@adport/provider-reddit": "0.6.0",
30
+ "@adport/provider-snapchat": "0.6.0",
31
+ "@adport/provider-spotify": "0.6.0",
32
+ "@adport/provider-pinterest": "0.6.0",
33
+ "@adport/provider-linkedin": "0.6.0",
34
+ "@adport/provider-x": "0.6.0",
35
+ "@adport/provider-tiktok": "0.6.0"
31
36
  },
32
37
  "devDependencies": {
33
38
  "@types/node": "^26.1.2",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json"],"sourcesContent":["import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { AdportError, CredentialStore, createContext, type AdportRuntime, type ProviderModule } from '@adport/core';\nimport { createGoogleModule } from '@adport/provider-google';\nimport { createMetaModule } from '@adport/provider-meta';\nimport { createTikTokModule } from '@adport/provider-tiktok';\nimport { createAppleModule } from '@adport/provider-apple';\nimport { createMicrosoftModule } from '@adport/provider-microsoft';\nimport { createRedditModule } from '@adport/provider-reddit';\nimport packageJson from '../package.json';\n\nexport const PROVIDER_IDS = ['google', 'meta', 'tiktok', 'apple', 'microsoft', 'reddit'] as const;\n\n/**\n * Standard runtime assembly: real providers whose credentials exist. Mock data\n * is opt-in so a live runtime never silently substitutes synthetic accounts.\n */\nexport interface AssembleRuntimeOptions {\n includeMock?: boolean;\n}\n\nexport async function assembleRuntime(options: AssembleRuntimeOptions = {}): Promise<AdportRuntime> {\n const store = new CredentialStore();\n const modules: ProviderModule[] = [];\n const includeMock = options.includeMock ?? process.env.ADPORT_DEMO === 'true';\n if (!includeMock) {\n for (const factory of [createGoogleModule, createMetaModule, createTikTokModule, createAppleModule, createMicrosoftModule, createRedditModule]) {\n const module = await factory(store);\n if (module) modules.push(module);\n }\n }\n return createContext({ providerModules: modules, includeMock });\n}\n\nexport interface CreateServerOptions {\n runtime: AdportRuntime;\n name?: string;\n version?: string;\n}\n\n/**\n * Thin adapter: every tool in the shared registry becomes an MCP tool.\n * No tool logic lives here — see the \"one tool-definition layer\" principle.\n */\nexport function createMcpServer({ runtime, name = 'adport', version = packageJson.version }: CreateServerOptions): McpServer {\n const server = new McpServer({ name, version });\n for (const tool of runtime.registry.list()) {\n server.registerTool(\n tool.name,\n {\n description: tool.description,\n inputSchema: tool.input.shape,\n annotations: {\n readOnlyHint: tool.annotations.readOnly ?? false,\n destructiveHint: tool.annotations.destructive ?? false,\n },\n },\n async (args: Record<string, unknown>) => {\n try {\n const result = await runtime.registry.call(tool.name, args, runtime.ctx);\n return { content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }] };\n } catch (err) {\n const payload =\n err instanceof AdportError\n ? err.toJSON()\n : { error: 'INTERNAL', message: err instanceof Error ? err.message : String(err) };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(payload, null, 2) }],\n isError: true,\n };\n }\n },\n );\n }\n return server;\n}\n\nexport async function runStdioServer(runtime: AdportRuntime, version?: string): Promise<void> {\n const server = createMcpServer({ runtime, version });\n await server.connect(new StdioServerTransport());\n // stdout is the protocol channel; stderr is for humans.\n console.error(`adport MCP server on stdio (${runtime.registry.list().length} tools, policy: ${runtime.policySource})`);\n if (runtime.ctx.providers.list().length === 0) {\n console.error('No ad providers connected. Run `adport connect <provider>` or restart with `--demo` for synthetic mock data.');\n }\n}\n","{\n \"name\": \"@adport/mcp\",\n \"version\": \"0.5.2\",\n \"description\": \"adport MCP server — the open control plane for paid media\",\n \"license\": \"Apache-2.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"bin\": {\n \"adport-mcp\": \"./dist/bin.js\"\n },\n \"files\": [\"dist\"],\n \"scripts\": {\n \"build\": \"tsup src/index.ts src/bin.ts --format esm --dts --sourcemap --clean\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rm -rf dist\"\n },\n \"dependencies\": {\n \"@adport/core\": \"workspace:*\",\n \"@adport/provider-apple\": \"workspace:*\",\n \"@adport/provider-google\": \"workspace:*\",\n \"@adport/provider-meta\": \"workspace:*\",\n \"@adport/provider-microsoft\": \"workspace:*\",\n \"@adport/provider-reddit\": \"workspace:*\",\n \"@adport/provider-tiktok\": \"workspace:*\",\n \"@modelcontextprotocol/sdk\": \"^1.12.0\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^26.1.2\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.8.0\",\n \"vitest\": \"^4.1.10\"\n }\n}\n"],"mappings":"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","names":[]}