meta-ads-mcp 1.0.1__tar.gz → 1.0.3__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-1.0.3/.github/workflows/publish-mcp.yml +68 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/PKG-INFO +3 -1
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/README.md +2 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/RELEASE.md +14 -9
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/__init__.py +1 -1
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/pyproject.toml +1 -1
- meta_ads_mcp-1.0.3/server.json +23 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/smithery.yaml +4 -1
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/.github/workflows/publish.yml +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/.github/workflows/test.yml +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/.gitignore +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/CUSTOM_META_APP.md +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/Dockerfile +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/LICENSE +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/LOCAL_INSTALLATION.md +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/META_API_NOTES.md +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/STREAMABLE_HTTP_SETUP.md +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/examples/README.md +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/examples/example_http_client.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/future_improvements.md +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/images/meta-ads-example.png +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_auth.sh +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/__main__.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/__init__.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/accounts.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/ads.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/ads_library.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/adsets.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/api.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/auth.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/authentication.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/budget_schedules.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/callback_server.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/campaigns.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/duplication.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/http_auth_integration.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/insights.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/openai_deep_research.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/pipeboard_auth.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/reports.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/resources.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/server.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/targeting.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/meta_ads_mcp/core/utils.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/requirements.txt +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/setup.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/README.md +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/README_REGRESSION_TESTS.md +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/__init__.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/conftest.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/e2e_account_info_search_issue.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_account_info_access_fix.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_account_search.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_budget_update.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_budget_update_e2e.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_dsa_beneficiary.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_dsa_integration.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_duplication.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_duplication_regression.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_dynamic_creatives.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_estimate_audience_size.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_estimate_audience_size_e2e.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_get_account_pages.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_get_ad_creatives_fix.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_get_ad_image_quality_improvements.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_get_ad_image_regression.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_http_transport.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_insights_actions_and_values_e2e.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_insights_pagination.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_integration_openai_mcp.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_is_dynamic_creative_adset.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_mobile_app_adset_creation.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_mobile_app_adset_issue.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_openai.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_openai_mcp_deep_research.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_page_discovery.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_page_discovery_integration.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_targeting.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_targeting_search_e2e.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_update_ad_creative_id.py +0 -0
- {meta_ads_mcp-1.0.1 → meta_ads_mcp-1.0.3}/tests/test_upload_ad_image.py +0 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
name: Publish to MCP Registry
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
publish:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
permissions:
|
|
11
|
+
id-token: write
|
|
12
|
+
contents: read
|
|
13
|
+
|
|
14
|
+
steps:
|
|
15
|
+
- name: Checkout code
|
|
16
|
+
uses: actions/checkout@v5
|
|
17
|
+
|
|
18
|
+
- name: Set up Python
|
|
19
|
+
uses: actions/setup-python@v5
|
|
20
|
+
with:
|
|
21
|
+
python-version: "3.12"
|
|
22
|
+
|
|
23
|
+
- name: Install uv
|
|
24
|
+
uses: astral-sh/setup-uv@v5
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: |
|
|
28
|
+
uv sync --all-extras --dev
|
|
29
|
+
|
|
30
|
+
- name: Run tests
|
|
31
|
+
run: |
|
|
32
|
+
uv run pytest -q
|
|
33
|
+
|
|
34
|
+
- name: Build wheel
|
|
35
|
+
run: |
|
|
36
|
+
uv build
|
|
37
|
+
|
|
38
|
+
- name: Validate server.json against schema
|
|
39
|
+
run: |
|
|
40
|
+
uv run python - <<'PY'
|
|
41
|
+
import json, sys, urllib.request
|
|
42
|
+
from jsonschema import validate
|
|
43
|
+
from jsonschema.exceptions import ValidationError
|
|
44
|
+
server = json.load(open('server.json'))
|
|
45
|
+
schema_url = server.get('$schema')
|
|
46
|
+
with urllib.request.urlopen(schema_url) as r:
|
|
47
|
+
schema = json.load(r)
|
|
48
|
+
try:
|
|
49
|
+
validate(instance=server, schema=schema)
|
|
50
|
+
except ValidationError as e:
|
|
51
|
+
print('Schema validation failed:', e, file=sys.stderr)
|
|
52
|
+
sys.exit(1)
|
|
53
|
+
print('server.json is valid')
|
|
54
|
+
PY
|
|
55
|
+
|
|
56
|
+
- name: Install MCP Publisher
|
|
57
|
+
run: |
|
|
58
|
+
curl -L "https://github.com/modelcontextprotocol/registry/releases/download/v1.0.0/mcp-publisher_1.0.0_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz mcp-publisher
|
|
59
|
+
|
|
60
|
+
- name: Login to MCP Registry (DNS auth)
|
|
61
|
+
run: |
|
|
62
|
+
echo "${{ secrets.MCP_PRIVATE_KEY }}" > key.pem
|
|
63
|
+
./mcp-publisher login dns --domain pipeboard.co --private-key-file key.pem
|
|
64
|
+
shred -u key.pem || rm -f key.pem
|
|
65
|
+
|
|
66
|
+
- name: Publish to MCP Registry
|
|
67
|
+
run: ./mcp-publisher publish
|
|
68
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meta-ads-mcp
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
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
|
|
@@ -31,6 +31,8 @@ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for in
|
|
|
31
31
|
|
|
32
32
|
[](https://github.com/user-attachments/assets/3e605cee-d289-414b-814c-6299e7f3383e)
|
|
33
33
|
|
|
34
|
+
<!-- mcp-name: co.pipeboard/meta-ads-mcp -->
|
|
35
|
+
|
|
34
36
|
## Community & Support
|
|
35
37
|
|
|
36
38
|
- [Discord](https://discord.gg/YzMwQ8zrjr). Join the community.
|
|
@@ -6,6 +6,8 @@ A [Model Context Protocol (MCP)](https://modelcontextprotocol.io/) server for in
|
|
|
6
6
|
|
|
7
7
|
[](https://github.com/user-attachments/assets/3e605cee-d289-414b-814c-6299e7f3383e)
|
|
8
8
|
|
|
9
|
+
<!-- mcp-name: co.pipeboard/meta-ads-mcp -->
|
|
10
|
+
|
|
9
11
|
## Community & Support
|
|
10
12
|
|
|
11
13
|
- [Discord](https://discord.gg/YzMwQ8zrjr). Join the community.
|
|
@@ -11,7 +11,7 @@ This repository uses GitHub Actions to automatically publish releases to PyPI. H
|
|
|
11
11
|
|
|
12
12
|
### Optimal Release Process
|
|
13
13
|
|
|
14
|
-
1. **Update version in
|
|
14
|
+
1. **Update version in three files** (use consistent versioning):
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
17
|
# Update pyproject.toml
|
|
@@ -19,15 +19,19 @@ This repository uses GitHub Actions to automatically publish releases to PyPI. H
|
|
|
19
19
|
|
|
20
20
|
# Update __init__.py
|
|
21
21
|
sed -i '' 's/__version__ = "0.7.7"/__version__ = "0.7.8"/' meta_ads_mcp/__init__.py
|
|
22
|
+
|
|
23
|
+
# Update server.json (both top-level and package versions)
|
|
24
|
+
sed -i '' 's/"version": "0.7.7"/"version": "0.7.8"/g' server.json
|
|
22
25
|
```
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
+
Or manually edit:
|
|
28
|
+
- `pyproject.toml`: `version = "0.7.8"`
|
|
29
|
+
- `meta_ads_mcp/__init__.py`: `__version__ = "0.7.8"`
|
|
30
|
+
- `server.json`: set `"version": "0.7.8"` and package `"version": "0.7.8"`
|
|
27
31
|
|
|
28
32
|
2. **Commit and push version changes**:
|
|
29
33
|
```bash
|
|
30
|
-
git add pyproject.toml meta_ads_mcp/__init__.py
|
|
34
|
+
git add pyproject.toml meta_ads_mcp/__init__.py server.json
|
|
31
35
|
git commit -m "Bump version to 0.7.8"
|
|
32
36
|
git push origin main
|
|
33
37
|
```
|
|
@@ -66,7 +70,7 @@ git status
|
|
|
66
70
|
uv run python -m pytest tests/ -v
|
|
67
71
|
|
|
68
72
|
# 3. Check current version
|
|
69
|
-
grep -E
|
|
73
|
+
grep -E 'version =|__version__|"version":' pyproject.toml meta_ads_mcp/__init__.py server.json
|
|
70
74
|
```
|
|
71
75
|
|
|
72
76
|
### Release Commands (One-liner)
|
|
@@ -76,7 +80,8 @@ grep -E "version =|__version__" pyproject.toml meta_ads_mcp/__init__.py
|
|
|
76
80
|
VERSION="0.7.8" && \
|
|
77
81
|
sed -i '' "s/version = \"0.7.7\"/version = \"$VERSION\"/" pyproject.toml && \
|
|
78
82
|
sed -i '' "s/__version__ = \"0.7.7\"/__version__ = \"$VERSION\"/" meta_ads_mcp/__init__.py && \
|
|
79
|
-
|
|
83
|
+
sed -i '' "s/\"version\": \"0.7.7\"/\"version\": \"$VERSION\"/g" server.json && \
|
|
84
|
+
git add pyproject.toml meta_ads_mcp/__init__.py server.json && \
|
|
80
85
|
git commit -m "Bump version to $VERSION" && \
|
|
81
86
|
git push origin main && \
|
|
82
87
|
bash -c "gh release create $VERSION --title '$VERSION' --generate-notes"
|
|
@@ -108,8 +113,8 @@ bash -c "gh release create $VERSION --title '$VERSION' --generate-notes"
|
|
|
108
113
|
|
|
109
114
|
2. **Version mismatch**:
|
|
110
115
|
```bash
|
|
111
|
-
# Verify
|
|
112
|
-
grep -E
|
|
116
|
+
# Verify all three files have the same version
|
|
117
|
+
grep -E 'version =|__version__|"version":' pyproject.toml meta_ads_mcp/__init__.py server.json
|
|
113
118
|
```
|
|
114
119
|
|
|
115
120
|
3. **PyPI not updated**:
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-16/server.schema.json",
|
|
3
|
+
"name": "co.pipeboard/meta-ads-mcp",
|
|
4
|
+
"description": "Facebook / Meta Ads automation with AI: analyze performance, test creatives, optimize spend.",
|
|
5
|
+
"version": "1.0.3",
|
|
6
|
+
"packages": [
|
|
7
|
+
{
|
|
8
|
+
"registryType": "pypi",
|
|
9
|
+
"identifier": "meta-ads-mcp",
|
|
10
|
+
"version": "1.0.3",
|
|
11
|
+
"transport": {
|
|
12
|
+
"type": "stdio"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"remotes": [
|
|
17
|
+
{
|
|
18
|
+
"type": "streamable-http",
|
|
19
|
+
"url": "https://mcp.pipeboard.co/meta-ads-mcp"
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|