meta-ads-mcp 0.10.5__tar.gz → 0.10.7__tar.gz
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.
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/LOCAL_INSTALLATION.md +1 -1
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/PKG-INFO +3 -2
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/README.md +2 -1
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/__init__.py +2 -3
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/__init__.py +2 -2
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/authentication.py +9 -2
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/campaigns.py +1 -1
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/pyproject.toml +1 -1
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/.github/workflows/publish.yml +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/.github/workflows/test.yml +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/.gitignore +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/CUSTOM_META_APP.md +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/Dockerfile +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/LICENSE +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/META_API_NOTES.md +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/RELEASE.md +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/STREAMABLE_HTTP_SETUP.md +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/examples/README.md +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/examples/example_http_client.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/future_improvements.md +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/images/meta-ads-example.png +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_auth.sh +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/__main__.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/accounts.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/ads.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/ads_library.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/adsets.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/api.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/auth.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/budget_schedules.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/callback_server.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/duplication.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/http_auth_integration.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/insights.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/openai_deep_research.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/pipeboard_auth.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/reports.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/resources.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/server.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/targeting.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/meta_ads_mcp/core/utils.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/requirements.txt +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/setup.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/smithery.yaml +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/README.md +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/README_REGRESSION_TESTS.md +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/__init__.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/conftest.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/e2e_account_info_search_issue.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_account_info_access_fix.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_account_search.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_budget_update.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_budget_update_e2e.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_dsa_beneficiary.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_dsa_integration.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_duplication.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_duplication_regression.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_dynamic_creatives.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_estimate_audience_size.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_estimate_audience_size_e2e.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_get_account_pages.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_get_ad_creatives_fix.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_get_ad_image_quality_improvements.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_get_ad_image_regression.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_http_transport.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_insights_actions_and_values.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_integration_openai_mcp.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_mobile_app_adset_creation.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_mobile_app_adset_issue.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_openai.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_openai_mcp_deep_research.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_page_discovery.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_page_discovery_integration.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_targeting.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_targeting_search_e2e.py +0 -0
- {meta_ads_mcp-0.10.5 → meta_ads_mcp-0.10.7}/tests/test_update_ad_creative_id.py +0 -0
|
@@ -480,7 +480,7 @@ If you're still experiencing issues:
|
|
|
480
480
|
|
|
481
481
|
1. **Check the logs** for detailed error messages
|
|
482
482
|
2. **Search existing issues** on GitHub
|
|
483
|
-
3. **Join our Discord** at [discord.gg/
|
|
483
|
+
3. **Join our Discord** at [discord.gg/YNjF7gUb5h](https://discord.gg/YNjF7gUb5h)
|
|
484
484
|
4. **Email support** at info@pipeboard.co
|
|
485
485
|
5. **Consider Remote MCP** at [pipeboard.co](https://pipeboard.co) as an alternative
|
|
486
486
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meta-ads-mcp
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.7
|
|
4
4
|
Summary: Model Context Protocol (MCP) server for interacting with Meta Ads API
|
|
5
5
|
Project-URL: Homepage, https://github.com/pipeboard-co/meta-ads-mcp
|
|
6
6
|
Project-URL: Bug Tracker, https://github.com/pipeboard-co/meta-ads-mcp/issues
|
|
@@ -33,7 +33,7 @@ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for in
|
|
|
33
33
|
|
|
34
34
|
## Community & Support
|
|
35
35
|
|
|
36
|
-
- [Discord](https://discord.gg/
|
|
36
|
+
- [Discord](https://discord.gg/YNjF7gUb5h). Join the community.
|
|
37
37
|
- [Email Support](info@pipeboard.co). Email us for support.
|
|
38
38
|
|
|
39
39
|
## Table of Contents
|
|
@@ -181,6 +181,7 @@ For local installation configuration, authentication options, and advanced techn
|
|
|
181
181
|
- `special_ad_categories`: List of special ad categories if applicable
|
|
182
182
|
- `daily_budget`: Daily budget in account currency (in cents)
|
|
183
183
|
- `lifetime_budget`: Lifetime budget in account currency (in cents)
|
|
184
|
+
- `bid_strategy`: Bid strategy. Must be one of: `LOWEST_COST_WITHOUT_CAP`, `LOWEST_COST_WITH_BID_CAP`, `COST_CAP`, `LOWEST_COST_WITH_MIN_ROAS`.
|
|
184
185
|
- Returns: Confirmation with new campaign details
|
|
185
186
|
|
|
186
187
|
7. `mcp_meta_ads_get_adsets`
|
|
@@ -8,7 +8,7 @@ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for in
|
|
|
8
8
|
|
|
9
9
|
## Community & Support
|
|
10
10
|
|
|
11
|
-
- [Discord](https://discord.gg/
|
|
11
|
+
- [Discord](https://discord.gg/YNjF7gUb5h). Join the community.
|
|
12
12
|
- [Email Support](info@pipeboard.co). Email us for support.
|
|
13
13
|
|
|
14
14
|
## Table of Contents
|
|
@@ -156,6 +156,7 @@ For local installation configuration, authentication options, and advanced techn
|
|
|
156
156
|
- `special_ad_categories`: List of special ad categories if applicable
|
|
157
157
|
- `daily_budget`: Daily budget in account currency (in cents)
|
|
158
158
|
- `lifetime_budget`: Lifetime budget in account currency (in cents)
|
|
159
|
+
- `bid_strategy`: Bid strategy. Must be one of: `LOWEST_COST_WITHOUT_CAP`, `LOWEST_COST_WITH_BID_CAP`, `COST_CAP`, `LOWEST_COST_WITH_MIN_ROAS`.
|
|
159
160
|
- Returns: Confirmation with new campaign details
|
|
160
161
|
|
|
161
162
|
7. `mcp_meta_ads_get_adsets`
|
|
@@ -7,7 +7,7 @@ with the Claude LLM.
|
|
|
7
7
|
|
|
8
8
|
from meta_ads_mcp.core.server import main
|
|
9
9
|
|
|
10
|
-
__version__ = "0.10.
|
|
10
|
+
__version__ = "0.10.7"
|
|
11
11
|
|
|
12
12
|
__all__ = [
|
|
13
13
|
'get_ad_accounts',
|
|
@@ -24,7 +24,7 @@ __all__ = [
|
|
|
24
24
|
'get_ad_image',
|
|
25
25
|
'update_ad',
|
|
26
26
|
'get_insights',
|
|
27
|
-
'get_login_link'
|
|
27
|
+
# 'get_login_link' is conditionally exported via core.__all__
|
|
28
28
|
'login_cli',
|
|
29
29
|
'main',
|
|
30
30
|
'search_interests',
|
|
@@ -51,7 +51,6 @@ from .core import (
|
|
|
51
51
|
get_ad_image,
|
|
52
52
|
update_ad,
|
|
53
53
|
get_insights,
|
|
54
|
-
get_login_link,
|
|
55
54
|
login_cli,
|
|
56
55
|
main,
|
|
57
56
|
search_interests,
|
|
@@ -6,7 +6,7 @@ from .campaigns import get_campaigns, get_campaign_details, create_campaign
|
|
|
6
6
|
from .adsets import get_adsets, get_adset_details, update_adset
|
|
7
7
|
from .ads import get_ads, get_ad_details, get_ad_creatives, get_ad_image, update_ad
|
|
8
8
|
from .insights import get_insights
|
|
9
|
-
from .
|
|
9
|
+
from . import authentication # Import module to register conditional auth tools
|
|
10
10
|
from .server import login_cli, main
|
|
11
11
|
from .auth import login
|
|
12
12
|
from . import ads_library # Import module to register conditional tools
|
|
@@ -32,7 +32,7 @@ __all__ = [
|
|
|
32
32
|
'get_ad_image',
|
|
33
33
|
'update_ad',
|
|
34
34
|
'get_insights',
|
|
35
|
-
'get_login_link'
|
|
35
|
+
# Note: 'get_login_link' is registered conditionally by the authentication module
|
|
36
36
|
'login_cli',
|
|
37
37
|
'login',
|
|
38
38
|
'main',
|
|
@@ -21,6 +21,7 @@ Environment Variables:
|
|
|
21
21
|
- PIPEBOARD_API_TOKEN: Enables mode 2 (token-based auth)
|
|
22
22
|
- META_ADS_DISABLE_CALLBACK_SERVER: Disables local server, enables mode 3
|
|
23
23
|
- META_ACCESS_TOKEN: Direct Meta token (fallback)
|
|
24
|
+
- META_ADS_DISABLE_LOGIN_LINK: Hard-disables the get_login_link tool; returns a disabled message
|
|
24
25
|
"""
|
|
25
26
|
|
|
26
27
|
import json
|
|
@@ -32,8 +33,10 @@ from .server import mcp_server
|
|
|
32
33
|
from .utils import logger, META_APP_SECRET
|
|
33
34
|
from .pipeboard_auth import pipeboard_auth_manager
|
|
34
35
|
|
|
36
|
+
# Only register the login link tool if not explicitly disabled
|
|
37
|
+
ENABLE_LOGIN_LINK = not bool(os.environ.get("META_ADS_DISABLE_LOGIN_LINK", ""))
|
|
38
|
+
|
|
35
39
|
|
|
36
|
-
@mcp_server.tool()
|
|
37
40
|
async def get_login_link(access_token: str = None) -> str:
|
|
38
41
|
"""
|
|
39
42
|
Get a clickable login link for Meta Ads authentication.
|
|
@@ -195,4 +198,8 @@ async def get_login_link(access_token: str = None) -> str:
|
|
|
195
198
|
# Wait a moment to ensure the server is fully started
|
|
196
199
|
await asyncio.sleep(1)
|
|
197
200
|
|
|
198
|
-
|
|
201
|
+
return json.dumps(response, indent=2)
|
|
202
|
+
|
|
203
|
+
# Conditionally register as MCP tool only when enabled
|
|
204
|
+
if ENABLE_LOGIN_LINK:
|
|
205
|
+
get_login_link = mcp_server.tool()(get_login_link)
|
|
@@ -115,7 +115,7 @@ async def create_campaign(
|
|
|
115
115
|
daily_budget: Daily budget in account currency (in cents) as a string (only used if use_adset_level_budgets=False)
|
|
116
116
|
lifetime_budget: Lifetime budget in account currency (in cents) as a string (only used if use_adset_level_budgets=False)
|
|
117
117
|
buying_type: Buying type (e.g., 'AUCTION')
|
|
118
|
-
bid_strategy: Bid strategy
|
|
118
|
+
bid_strategy: Bid strategy. Must be one of: 'LOWEST_COST_WITHOUT_CAP', 'LOWEST_COST_WITH_BID_CAP', 'COST_CAP', 'LOWEST_COST_WITH_MIN_ROAS'.
|
|
119
119
|
bid_cap: Bid cap in account currency (in cents) as a string
|
|
120
120
|
spend_cap: Spending limit for the campaign in account currency (in cents) as a string
|
|
121
121
|
campaign_budget_optimization: Whether to enable campaign budget optimization (only used if use_adset_level_budgets=False)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|