openads-ai 0.2.12 → 0.2.14
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/cli.js +2 -0
- package/dist/mcp-extension.js +24 -4
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -94,6 +94,8 @@ function buildSystemPrompt(config) {
|
|
|
94
94
|
'- Whenever the user asks to check campaigns, review metrics, fetch performance data, or analyze active ads, you MUST use the corresponding MCP server tools to query the live platforms.',
|
|
95
95
|
'- NEVER search the local file system, run grep/ripgrep, check Git logs, or read codebase files to search for ad campaign data. The active folder is just the application source code — it contains zero campaign metrics. Campaign data comes ONLY from querying your active MCP server tools.',
|
|
96
96
|
'- To fetch Meta campaign data: ALWAYS call `get_ad_accounts()` first (takes no parameters) to retrieve the active account ID (e.g., `act_123456789`). Then call `list_campaigns(account_id)` to list campaigns and retrieve active campaign IDs. Finally, call `get_campaign_performance` or `get_insights` using the retrieved IDs. Never guess or omit `object_id` when calling performance tools.',
|
|
97
|
+
'- You are a highly proactive, self-starting digital marketer. When the user asks to check campaigns or fetch reports, DO NOT ask for permission or prompt them for campaign IDs. IMMEDIATELY call your read-only discovery tools (`get_ad_accounts` followed by `list_campaigns`) to fetch the active IDs and retrieve the data yourself. Be proactive and deliver results instantly rather than hesitating or asking redundant confirmation questions.',
|
|
98
|
+
'- ANTI-LOOP SAFETY RULE: Once a tool (like `get_ad_accounts`) successfully returns its data, NEVER call it again in the same turn. Proceed immediately to the next logical step (e.g. calling `list_campaigns` or `get_campaign_performance`). If you repeat the exact same tool call consecutively, your connection will be flagged. Always move forward and progress through the tool chain.',
|
|
97
99
|
];
|
|
98
100
|
if (isLaunchMode) {
|
|
99
101
|
parts.push('YOU ARE OPERATING IN LAUNCH MODE (READ-WRITE).', 'You are authorized to execute active write modifications on ad accounts (e.g. pausing campaigns, scaling bids, altering daily budgets, creating ads).', 'CRITICAL SAFETY RULE: For any write operation, you MUST generate a clear visual preview card outlining the exact changes and ask the user for explicit confirmation (Y/N) before executing. NEVER make active changes without their explicit confirmation.');
|
package/dist/mcp-extension.js
CHANGED
|
@@ -4,6 +4,22 @@ import { hasGlobalRtk } from "./token-optimizer.js";
|
|
|
4
4
|
import fs from "fs";
|
|
5
5
|
import path from "path";
|
|
6
6
|
import os from "os";
|
|
7
|
+
// ─── Essential Campaign Analysis & Audit Tools ──────────────────────
|
|
8
|
+
// Filtering down from 39 tools to 11 essential campaign performance tools
|
|
9
|
+
// massively optimizes local LLM context, prevents tool confusion, and breaks repeating loops.
|
|
10
|
+
const ESSENTIAL_META_TOOLS = new Set([
|
|
11
|
+
"get_ad_accounts",
|
|
12
|
+
"list_campaigns",
|
|
13
|
+
"get_campaign",
|
|
14
|
+
"get_campaign_performance",
|
|
15
|
+
"get_insights",
|
|
16
|
+
"list_ad_sets",
|
|
17
|
+
"list_ads",
|
|
18
|
+
"get_creative_performance",
|
|
19
|
+
"pause_campaign",
|
|
20
|
+
"resume_campaign",
|
|
21
|
+
"update_campaign"
|
|
22
|
+
]);
|
|
7
23
|
export default async function (pi) {
|
|
8
24
|
const configDir = path.join(os.homedir(), '.openads');
|
|
9
25
|
const configPath = path.join(configDir, 'openads.config.json');
|
|
@@ -27,9 +43,9 @@ export default async function (pi) {
|
|
|
27
43
|
const googleTransport = new StdioClientTransport({
|
|
28
44
|
command,
|
|
29
45
|
args,
|
|
30
|
-
stderr: "ignore"
|
|
46
|
+
stderr: "ignore"
|
|
31
47
|
});
|
|
32
|
-
const googleClient = new Client({ name: "openads-google-ads-client", version: "0.2.
|
|
48
|
+
const googleClient = new Client({ name: "openads-google-ads-client", version: "0.2.14" }, { capabilities: {} });
|
|
33
49
|
await googleClient.connect(googleTransport);
|
|
34
50
|
clients.push({ name: "google-ads", client: googleClient });
|
|
35
51
|
}
|
|
@@ -50,9 +66,9 @@ export default async function (pi) {
|
|
|
50
66
|
...process.env,
|
|
51
67
|
"META_ACCESS_TOKEN": config.metaToken
|
|
52
68
|
},
|
|
53
|
-
stderr: "ignore"
|
|
69
|
+
stderr: "ignore"
|
|
54
70
|
});
|
|
55
|
-
const metaClient = new Client({ name: "openads-meta-ads-client", version: "0.2.
|
|
71
|
+
const metaClient = new Client({ name: "openads-meta-ads-client", version: "0.2.14" }, { capabilities: {} });
|
|
56
72
|
await metaClient.connect(metaTransport);
|
|
57
73
|
clients.push({ name: "meta-ads", client: metaClient });
|
|
58
74
|
}
|
|
@@ -65,6 +81,10 @@ export default async function (pi) {
|
|
|
65
81
|
try {
|
|
66
82
|
const toolsResult = await client.listTools();
|
|
67
83
|
for (const tool of toolsResult.tools) {
|
|
84
|
+
// Filter out advanced/OAuth/developer tools for Meta Ads to keep the LLM context extremely clean
|
|
85
|
+
if (serverName === "meta-ads" && !ESSENTIAL_META_TOOLS.has(tool.name)) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
68
88
|
pi.registerTool({
|
|
69
89
|
name: tool.name,
|
|
70
90
|
label: tool.name.replace(/_/g, ' ').replace(/\b\w/g, c => c.toUpperCase()),
|
package/package.json
CHANGED