meta-ads-mcp 0.2.6__py3-none-any.whl → 0.2.8__py3-none-any.whl

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.
@@ -4,9 +4,12 @@ from mcp.server.fastmcp import FastMCP
4
4
  import argparse
5
5
  import os
6
6
  import sys
7
+ import webbrowser
7
8
  from .auth import login as login_auth
8
9
  from .resources import list_resources, get_resource
9
10
  from .utils import logger
11
+ from .pipeboard_auth import pipeboard_auth_manager
12
+ import time
10
13
 
11
14
  # Initialize FastMCP server
12
15
  mcp_server = FastMCP("meta-ads", use_consistent_tool_format=True)
@@ -78,7 +81,49 @@ def main():
78
81
  # Handle login command
79
82
  if args.login:
80
83
  login_cli()
81
- else:
82
- # Initialize and run the server
83
- logger.info("Starting MCP server with stdio transport")
84
- mcp_server.run(transport='stdio')
84
+ return 0
85
+
86
+ # Check for Pipeboard authentication and token
87
+ pipeboard_api_token = os.environ.get("PIPEBOARD_API_TOKEN")
88
+ if pipeboard_api_token:
89
+ logger.info("Using Pipeboard authentication")
90
+ # Check for existing token
91
+ token = pipeboard_auth_manager.get_access_token()
92
+ if not token:
93
+ logger.info("No valid Pipeboard token found. Initiating browser-based authentication flow.")
94
+ print("No valid Meta token found. Opening browser for authentication...")
95
+ try:
96
+ # Initialize the auth flow and get the login URL
97
+ auth_data = pipeboard_auth_manager.initiate_auth_flow()
98
+ login_url = auth_data.get('loginUrl')
99
+ if login_url:
100
+ logger.info(f"Opening browser with login URL: {login_url}")
101
+ webbrowser.open(login_url)
102
+ print("Please authorize the application in your browser.")
103
+ print("After authorization, the token will be automatically retrieved.")
104
+ print("Waiting for authentication to complete...")
105
+
106
+ # Poll for token completion
107
+ max_attempts = 30 # Try for 30 * 2 = 60 seconds
108
+ for attempt in range(max_attempts):
109
+ print(f"Waiting for authentication... ({attempt+1}/{max_attempts})")
110
+ # Try to get the token again
111
+ token = pipeboard_auth_manager.get_access_token(force_refresh=True)
112
+ if token:
113
+ print("Authentication successful!")
114
+ break
115
+ time.sleep(2) # Wait 2 seconds between attempts
116
+
117
+ if not token:
118
+ print("Authentication timed out. Starting server anyway.")
119
+ print("You may need to restart the server after completing authentication.")
120
+ else:
121
+ logger.error("No login URL received from Pipeboard API")
122
+ print("Error: Could not get authentication URL. Check your API token.")
123
+ except Exception as e:
124
+ logger.error(f"Error initiating browser-based authentication: {e}")
125
+ print(f"Error: Could not start authentication: {e}")
126
+
127
+ # Initialize and run the server
128
+ logger.info("Starting MCP server with stdio transport")
129
+ mcp_server.run(transport='stdio')
@@ -17,11 +17,16 @@ import platform
17
17
  META_APP_ID = os.environ.get("META_APP_ID", "")
18
18
  META_APP_SECRET = os.environ.get("META_APP_SECRET", "")
19
19
 
20
- # Print warning if Meta app credentials are not configured
21
- if not META_APP_ID:
22
- print("WARNING: META_APP_ID environment variable is not set. Authentication will not work properly.")
23
- if not META_APP_SECRET:
24
- print("WARNING: META_APP_SECRET environment variable is not set. Long-lived token exchange will not work.")
20
+ # Only show warnings about Meta credentials if we're not using Pipeboard
21
+ # Check for Pipeboard token in environment
22
+ using_pipeboard = bool(os.environ.get("PIPEBOARD_API_TOKEN", ""))
23
+
24
+ # Print warning if Meta app credentials are not configured and not using Pipeboard
25
+ if not using_pipeboard:
26
+ if not META_APP_ID:
27
+ print("WARNING: META_APP_ID environment variable is not set. Authentication will not work properly.")
28
+ if not META_APP_SECRET:
29
+ print("WARNING: META_APP_SECRET environment variable is not set. Long-lived token exchange will not work.")
25
30
 
26
31
  # Configure logging to file
27
32
  def setup_logging():
@@ -55,6 +60,7 @@ def setup_logging():
55
60
  # Log startup information
56
61
  logger.info(f"Logging initialized. Log file: {log_file}")
57
62
  logger.info(f"Platform: {platform.system()} {platform.release()}")
63
+ logger.info(f"Using Pipeboard authentication: {using_pipeboard}")
58
64
 
59
65
  return logger
60
66
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meta-ads-mcp
3
- Version: 0.2.6
3
+ Version: 0.2.8
4
4
  Summary: Model Calling Protocol (MCP) plugin for interacting with Meta Ads API
5
5
  Project-URL: Homepage, https://github.com/nictuku/meta-ads-mcp
6
6
  Project-URL: Bug Tracker, https://github.com/nictuku/meta-ads-mcp/issues
@@ -15,6 +15,7 @@ Requires-Dist: httpx>=0.26.0
15
15
  Requires-Dist: mcp[cli]>=1.6.0
16
16
  Requires-Dist: pathlib>=1.0.1
17
17
  Requires-Dist: pillow>=10.0.0
18
+ Requires-Dist: python-dateutil>=2.8.2
18
19
  Requires-Dist: python-dotenv>=1.1.0
19
20
  Requires-Dist: requests>=2.32.3
20
21
  Description-Content-Type: text/markdown
@@ -49,6 +50,11 @@ Screenhot: using an LLM to understand your ad performance.
49
50
  When using uv no specific installation is needed. We can use uvx to directly run meta-ads-mcp:
50
51
 
51
52
  ```bash
53
+ # RECOMMENDED: Use with Pipeboard authentication
54
+ export PIPEBOARD_API_TOKEN=your_pipeboard_token # Get your token at https://pipeboard.co
55
+ uvx meta-ads-mcp
56
+
57
+ # Alternative: Use with direct Meta authentication
52
58
  uvx meta-ads-mcp --app-id YOUR_META_ADS_APP_ID
53
59
  ```
54
60
 
@@ -76,15 +82,50 @@ pip install meta-ads-mcp
76
82
  After installation, you can run it as:
77
83
 
78
84
  ```bash
85
+ # RECOMMENDED: Use with Pipeboard authentication
86
+ export PIPEBOARD_API_TOKEN=your_pipeboard_token # Get your token at https://pipeboard.co
79
87
  python -m meta_ads_mcp
88
+
89
+ # Alternative: Use with direct Meta authentication
90
+ python -m meta_ads_mcp --app-id YOUR_META_ADS_APP_ID
80
91
  ```
81
92
 
82
93
  ## Configuration
83
94
 
95
+ ### Quick Start with Pipeboard Authentication (Recommended)
96
+
97
+ The easiest way to configure Meta Ads MCP is using Pipeboard authentication:
98
+
99
+ 1. Sign up at [Pipeboard.co](https://pipeboard.co) and generate an API token - **Get your free token at [https://pipeboard.co](https://pipeboard.co)**
100
+ 2. Set the environment variable:
101
+ ```bash
102
+ export PIPEBOARD_API_TOKEN=your_pipeboard_token # Token obtainable via https://pipeboard.co
103
+ ```
104
+ 3. Run meta-ads-mcp without needing to set up a Meta Developer App:
105
+ ```bash
106
+ uvx meta-ads-mcp
107
+ ```
108
+
109
+ This method provides longer-lived tokens (60 days), simplified setup, and automatic token renewal.
110
+
84
111
  ### Usage with Claude in Cursor
85
112
 
86
113
  Add this to your `claude_desktop_config.json` to integrate with Claude in Cursor:
87
114
 
115
+ ```json
116
+ "mcpServers": {
117
+ "meta-ads": {
118
+ "command": "uvx",
119
+ "args": ["meta-ads-mcp"],
120
+ "env": {
121
+ "PIPEBOARD_API_TOKEN": "your_pipeboard_token" // Token obtainable via https://pipeboard.co
122
+ }
123
+ }
124
+ }
125
+ ```
126
+
127
+ Or if you prefer direct Meta authentication (using your own Facebook app):
128
+
88
129
  ```json
89
130
  "mcpServers": {
90
131
  "meta-ads": {
@@ -228,6 +269,7 @@ Add this to your `claude_desktop_config.json` to integrate with Claude in Cursor
228
269
 
229
270
  16. `mcp_meta_ads_get_login_link`
230
271
  - Get a clickable login link for Meta Ads authentication
272
+ - NOTE: This method should only be used if you're using your own Facebook app. If using Pipeboard authentication (recommended), set the PIPEBOARD_API_TOKEN environment variable instead (token obtainable via https://pipeboard.co).
231
273
  - Inputs:
232
274
  - `access_token` (optional): Meta API access token (will use cached token if not provided)
233
275
  - Returns: A clickable resource link for Meta authentication
@@ -244,13 +286,47 @@ Before using the MCP server, you'll need to set up a Meta Developer App:
244
286
 
245
287
  ## Authentication
246
288
 
247
- The Meta Ads MCP uses the OAuth 2.0 flow designed for desktop apps. When authenticating, it will:
289
+ The Meta Ads MCP supports two authentication methods:
290
+
291
+ ### 1. Pipeboard Authentication (Recommended ⭐)
292
+
293
+ This method uses [Pipeboard.co](https://pipeboard.co) to manage Meta API authentication, providing longer-lived tokens and a simplified flow:
294
+
295
+ 1. **Get your Pipeboard token**: Sign up at [https://pipeboard.co](https://pipeboard.co) to generate your free API token
296
+ 2. Set the `PIPEBOARD_API_TOKEN` environment variable with your token:
297
+ ```bash
298
+ export PIPEBOARD_API_TOKEN=your_pipeboard_token
299
+ ```
300
+ 3. Run the Meta Ads MCP normally - it will automatically detect and use Pipeboard authentication:
301
+ ```bash
302
+ uvx meta-ads-mcp
303
+ ```
304
+ 4. The first time you run a command, you'll be provided with a login URL to authorize with Meta
305
+
306
+ **Benefits of Pipeboard authentication:**
307
+ - ✅ Longer-lived tokens (60 days)
308
+ - ✅ No need to configure a Meta Developer App
309
+ - ✅ Simpler setup with just an API token
310
+ - ✅ Automatic token renewal
311
+
312
+ To test the Pipeboard authentication flow:
313
+ ```bash
314
+ python test_pipeboard_auth.py --api-token YOUR_PIPEBOARD_TOKEN
315
+ ```
316
+
317
+ ### 2. Direct Meta OAuth (Legacy)
318
+
319
+ The traditional OAuth 2.0 flow designed for desktop apps. This method should only be used if you are using your own Facebook app instead of Pipeboard.
320
+
321
+ When authenticating, it will:
248
322
 
249
323
  1. Start a local callback server on your machine
250
324
  2. Open a browser window to authenticate with Meta
251
325
  3. Ask you to authorize the app
252
326
  4. Redirect back to the local server to extract and store the token securely
253
327
 
328
+ This method requires you to [create a Meta Developer App](#create-a-meta-developer-app) first.
329
+
254
330
  ## Troubleshooting and Logging
255
331
 
256
332
  The Meta Ads MCP includes a comprehensive logging system to help troubleshoot issues:
@@ -265,21 +341,29 @@ Log files are stored in a platform-specific location:
265
341
 
266
342
  ### Common Issues
267
343
 
268
- #### App ID Issues
344
+ #### Authentication Issues
269
345
 
270
- If you encounter errors like `(#200) Provide valid app ID`, check the following:
346
+ If you're having authentication problems:
271
347
 
272
- 1. Ensure you've set up a Meta Developer App correctly
273
- 2. Verify that you're passing the correct App ID using one of these methods:
274
- - Set the `META_APP_ID` environment variable: `export META_APP_ID=your_app_id`
275
- - Pass it as a command-line argument: `meta-ads-mcp --app-id your_app_id`
348
+ 1. **Recommended: Use Pipeboard Authentication**
349
+ - Set `export PIPEBOARD_API_TOKEN=your_token` and retry
350
+ - This provides longer-lived tokens and better reliability
351
+ - Verify your token in the Pipeboard dashboard
276
352
 
277
- #### Authentication Errors
353
+ 2. For App ID issues (when using direct authentication):
354
+ If you encounter errors like `(#200) Provide valid app ID`, check the following:
355
+ - Ensure you've set up a Meta Developer App correctly
356
+ - Verify that you're passing the correct App ID using one of these methods:
357
+ - Set the `META_APP_ID` environment variable: `export META_APP_ID=your_app_id`
358
+ - Pass it as a command-line argument: `meta-ads-mcp --app-id your_app_id`
278
359
 
279
- Authentication errors can be tracked in the log file. Check for:
280
- - Token expiration issues
281
- - App permission problems
282
- - Connection errors
360
+ #### API Errors
361
+
362
+ If you receive errors from the Meta API:
363
+
364
+ 1. Verify your app has the Marketing API product added
365
+ 2. Ensure the user has appropriate permissions on the ad accounts
366
+ 3. Check if there are rate limits or other restrictions on your app
283
367
 
284
368
  ### Debugging Command
285
369
 
@@ -310,14 +394,15 @@ uvx meta-ads-mcp --app-id=your_app_id
310
394
  The Meta Ads MCP follows security best practices:
311
395
 
312
396
  1. Tokens are cached in a platform-specific secure location:
313
- - Windows: `%APPDATA%\meta-ads-mcp\token_cache.json`
314
- - macOS: `~/Library/Application Support/meta-ads-mcp/token_cache.json`
315
- - Linux: `~/.config/meta-ads-mcp/token_cache.json`
397
+ - Windows: `%APPDATA%\meta-ads-mcp\token_cache.json` or `%APPDATA%\meta-ads-mcp\pipeboard_token_cache.json`
398
+ - macOS: `~/Library/Application Support/meta-ads-mcp/token_cache.json` or `~/Library/Application Support/meta-ads-mcp/pipeboard_token_cache.json`
399
+ - Linux: `~/.config/meta-ads-mcp/token_cache.json` or `~/.config/meta-ads-mcp/pipeboard_token_cache.json`
316
400
 
317
401
  2. You do not need to provide your access token for each command; it will be automatically retrieved from the cache.
318
402
 
319
403
  3. You can set the following environment variables instead of passing them as arguments:
320
- - `META_APP_ID`: Your Meta App ID (Client ID)
404
+ - `META_APP_ID`: Your Meta App ID (Client ID) - for direct OAuth method
405
+ - `PIPEBOARD_API_TOKEN`: Your Pipeboard API token - for Pipeboard authentication method
321
406
 
322
407
  ## Testing
323
408
 
@@ -339,11 +424,12 @@ python test_meta_ads_auth.py --app-id YOUR_APP_ID --force-login
339
424
 
340
425
  When using the Meta Ads MCP with an LLM interface (like Claude):
341
426
 
342
- 1. Test authentication by calling the `mcp_meta_ads_get_login_link` tool
343
- 2. Verify account access by calling `mcp_meta_ads_get_ad_accounts`
344
- 3. Check specific account details with `mcp_meta_ads_get_account_info`
427
+ 1. If using direct Meta authentication (your own Facebook app), test authentication by calling the `mcp_meta_ads_get_login_link` tool
428
+ 2. If using Pipeboard authentication (recommended), ensure the PIPEBOARD_API_TOKEN environment variable is set (token obtainable via https://pipeboard.co)
429
+ 3. Verify account access by calling `mcp_meta_ads_get_ad_accounts`
430
+ 4. Check specific account details with `mcp_meta_ads_get_account_info`
345
431
 
346
- These functions will automatically handle authentication if needed and provide a clickable login link.
432
+ These functions will automatically handle authentication if needed and provide a clickable login link if required.
347
433
 
348
434
  ## Troubleshooting
349
435
 
@@ -352,20 +438,20 @@ These functions will automatically handle authentication if needed and provide a
352
438
  If you encounter authentication issues:
353
439
 
354
440
  1. When using the LLM interface:
355
- - Use the `mcp_meta_ads_get_login_link` tool to generate a fresh authentication link
441
+ - If using direct Meta authentication (your own Facebook app), use the `mcp_meta_ads_get_login_link` tool to generate a fresh authentication link
442
+ - If using Pipeboard authentication (recommended), ensure the PIPEBOARD_API_TOKEN environment variable is set (token obtainable via https://pipeboard.co)
356
443
  - Ensure you click the link and complete the authorization flow in your browser
357
444
  - Check that the callback server is running properly (the tool will report this)
358
445
 
359
- 2. When using the command line:
446
+ 2. When using Pipeboard authentication:
447
+ - Verify your `PIPEBOARD_API_TOKEN` is set correctly (token obtainable via https://pipeboard.co)
448
+ - Check if you need to complete the authorization process by visiting the provided login URL
449
+ - Try forcing a new login: `python test_pipeboard_auth.py --force-login`
450
+
451
+ 3. When using direct Meta OAuth:
360
452
  - Run with `--force-login` to get a fresh token: `uvx meta-ads-mcp --login --app-id YOUR_APP_ID --force-login`
361
453
  - Make sure the terminal has permissions to open a browser window
362
454
 
363
- 3. General authentication troubleshooting:
364
- - Check that your app is properly configured in the Meta Developers portal
365
- - Ensure your app has the necessary permissions (ads_management, ads_read, business_management)
366
- - Verify the app's redirect URI includes `http://localhost:8888/callback`
367
- - Try clearing the token cache (located in platform-specific directories listed in the Token Caching section)
368
-
369
455
  ### API Errors
370
456
 
371
457
  If you receive errors from the Meta API:
@@ -0,0 +1,21 @@
1
+ meta_ads_mcp/__init__.py,sha256=uoDoht-lvXHE6xVXDhLKtnB4QltQVpDwU5styQ3VtVk,1236
2
+ meta_ads_mcp/__main__.py,sha256=XaQt3iXftG_7f0Zu7Wop9SeFgrD2WBn0EQOaPMc27d8,207
3
+ meta_ads_mcp/api.py,sha256=lSyyvvcqZ8sGcd0R9Vk2b_4zDANTiU_z6AojfL7v41s,81984
4
+ meta_ads_mcp/core/__init__.py,sha256=6T8iqrQrw9VHhKtncLqYWyDk8jeSBPs79hs1CSu-fLU,952
5
+ meta_ads_mcp/core/accounts.py,sha256=Nmp7lPxO9wmq25jWV7_H0LIqnEbBhpCVBlLGW2HUaq0,2277
6
+ meta_ads_mcp/core/ads.py,sha256=jAwa1gD3HpXFhDW53cUMYwnt52jmBjTHTwb9HUk0EaA,16975
7
+ meta_ads_mcp/core/adsets.py,sha256=ae6mreRtigqS7TnSI0AQA7wOeZpjwcSJ6q2nKpl1e5Q,7598
8
+ meta_ads_mcp/core/api.py,sha256=ZflFD9WWScuSqi9c9m8b_Ck8S1FSTGENd3sh9rL5HfY,14182
9
+ meta_ads_mcp/core/auth.py,sha256=bWJ0sRhowuHzsTHUOZ67jaa-Pjfl46Pbs7igafpi5Xc,20644
10
+ meta_ads_mcp/core/authentication.py,sha256=3AHSXslZdxyg0_s2253aQhpOeguMSu2cSYq4H_auywY,6485
11
+ meta_ads_mcp/core/callback_server.py,sha256=b5TzUz9nEk0i5MWujlls5gAsHru__UjTPJQan1xQ_10,40947
12
+ meta_ads_mcp/core/campaigns.py,sha256=u5jNHSxcWlZgzVLNmaeoovA9OcPjSUjTegUMcDLAurs,4381
13
+ meta_ads_mcp/core/insights.py,sha256=f4Rs3kG0oqpKl8zBc_nt_zE0z4zvb9i0g12galrDiw8,17376
14
+ meta_ads_mcp/core/pipeboard_auth.py,sha256=hmd9f54fFWwQgf3QIlFhyTKBnK4RetVealh_LwhmFvE,22798
15
+ meta_ads_mcp/core/resources.py,sha256=-zIIfZulpo76vcKv6jhAlQq91cR2SZ3cjYZt3ek3x0w,1236
16
+ meta_ads_mcp/core/server.py,sha256=5WofyJZGzeDhbGzLXPhQjT0XnZwo0syeK8TM_XnJo4Q,5507
17
+ meta_ads_mcp/core/utils.py,sha256=EPmpBX3OZaTWRS_YuEk_PLLyLXj7DeR6Ks8WoaZ5JGQ,6366
18
+ meta_ads_mcp-0.2.8.dist-info/METADATA,sha256=GpkZAczdJeBD3-4o2nr-WYbRbp17026oEoGcY2zYXMo,19316
19
+ meta_ads_mcp-0.2.8.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
20
+ meta_ads_mcp-0.2.8.dist-info/entry_points.txt,sha256=Dv2RkoBjRJBqj6CyhwqGIiwPCD-SCL1-7B9-zmVRuv0,57
21
+ meta_ads_mcp-0.2.8.dist-info/RECORD,,
@@ -1,20 +0,0 @@
1
- meta_ads_mcp/__init__.py,sha256=r_A2NaKWasOAmt5IT2zhGrE2FRjVIMYiQKXZ9LMxTI0,1236
2
- meta_ads_mcp/__main__.py,sha256=XaQt3iXftG_7f0Zu7Wop9SeFgrD2WBn0EQOaPMc27d8,207
3
- meta_ads_mcp/api.py,sha256=9mmoJIdkC3PexZn3hw8XiKznecsbOSnhHtdEsJiPIyw,77475
4
- meta_ads_mcp/core/__init__.py,sha256=BA93zC6D8CzKbLo4JqqNqahq2LVgWBsoIXmJCK4AdIc,924
5
- meta_ads_mcp/core/accounts.py,sha256=Nmp7lPxO9wmq25jWV7_H0LIqnEbBhpCVBlLGW2HUaq0,2277
6
- meta_ads_mcp/core/ads.py,sha256=jAwa1gD3HpXFhDW53cUMYwnt52jmBjTHTwb9HUk0EaA,16975
7
- meta_ads_mcp/core/adsets.py,sha256=zSC67UhrhiinLY_SYSMNjRlmSZxCvyBYXIXroPBaVNc,7359
8
- meta_ads_mcp/core/api.py,sha256=AurfnoUZoIq9WS4cnsmVqpxc3pdsws8jvNhzQzdzLGg,12209
9
- meta_ads_mcp/core/auth.py,sha256=2uFGSD_6l8ExS1CQx7VQnPDq2yIb1fAk_t1BFFGQr7A,16881
10
- meta_ads_mcp/core/authentication.py,sha256=6zoGorswj5kRbrt_18A8KrZdCORNLGHybvb7XRQ1yJg,3474
11
- meta_ads_mcp/core/callback_server.py,sha256=b5TzUz9nEk0i5MWujlls5gAsHru__UjTPJQan1xQ_10,40947
12
- meta_ads_mcp/core/campaigns.py,sha256=u5jNHSxcWlZgzVLNmaeoovA9OcPjSUjTegUMcDLAurs,4381
13
- meta_ads_mcp/core/insights.py,sha256=f4Rs3kG0oqpKl8zBc_nt_zE0z4zvb9i0g12galrDiw8,17376
14
- meta_ads_mcp/core/resources.py,sha256=-zIIfZulpo76vcKv6jhAlQq91cR2SZ3cjYZt3ek3x0w,1236
15
- meta_ads_mcp/core/server.py,sha256=-tClGe4rc-8U2ihgpipLstiTPRg3-CnjsTRgncsNa_A,3055
16
- meta_ads_mcp/core/utils.py,sha256=wxh722z-x0TSJwDEEeDylkv4VJqLmqnkZy-YGRzs4vQ,6049
17
- meta_ads_mcp-0.2.6.dist-info/METADATA,sha256=4UUxhxKMIfZ9bvMfqW6CJb8-6bJibUaXElSsdmrFBa4,15300
18
- meta_ads_mcp-0.2.6.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
19
- meta_ads_mcp-0.2.6.dist-info/entry_points.txt,sha256=Dv2RkoBjRJBqj6CyhwqGIiwPCD-SCL1-7B9-zmVRuv0,57
20
- meta_ads_mcp-0.2.6.dist-info/RECORD,,