Skip to main content
Glama
flin-agency

flin-meta-ads-mcp

by flin-agency
README.md
# flin-meta-ads-mcp

`flin-meta-ads-mcp` is a public, strict read-only MCP server for Meta Ads. It is designed to be installed with `uvx` and loaded into Claude with minimal setup.

## What it does

- Lists and reads Meta Ads accounts
- Reads campaigns, ad sets, ads, ad images, and creatives
- Gets ad previews (including `preview_url` links)
- Fetches insights for account, campaign, ad set, and ad levels
- Stays read-only in `v0.1.x`

## Scope for `v0.1.x`

This release is strictly read-only.

That means:

- No create, update, pause, resume, or delete actions
- No OAuth flow or token refresh
- No generic Graph API proxy

## Install

Install and run the latest published PyPI release:

```bash
uvx flin-meta-ads-mcp
```

Install and refresh to the newest published release:

```bash
uvx --refresh flin-meta-ads-mcp
```

Run the latest GitHub code (main branch):

```bash
uvx --refresh --from git+https://github.com/flin-agency/flin-meta-ads-mcp.git flin-meta-ads-mcp
```

## Claude config

Stable (latest published PyPI release, refreshed):

```json
{
  "mcpServers": {
    "flin-meta-ads-mcp": {
      "command": "uvx",
      "args": ["--refresh", "flin-meta-ads-mcp"],
      "env": {
        "META_ACCESS_TOKEN": "EAA...",
        "META_GRAPH_API_VERSION": "v21.0"
      }
    }
  }
}
```

Latest GitHub code (main branch, refreshed):

```json
{
  "mcpServers": {
    "flin-meta-ads-mcp": {
      "command": "uvx",
      "args": [
        "--refresh",
        "--from",
        "git+https://github.com/flin-agency/flin-meta-ads-mcp.git",
        "flin-meta-ads-mcp"
      ],
      "env": {
        "META_ACCESS_TOKEN": "EAA...",
        "META_GRAPH_API_VERSION": "v21.0"
      }
    }
  }
}
```

## Environment variables

Required:

- `META_ACCESS_TOKEN`: Meta access token with read permissions

Optional:

- `META_GRAPH_API_VERSION`: Graph API version, default `v21.0`
- `META_TIMEOUT_SECONDS`: request timeout, default `30`
- `META_MAX_RETRIES`: retry count for transient failures, default `3`
- `META_DEFAULT_AD_ACCOUNT_ID`: optional fallback ad account (e.g. `act_123...`) used when a tool call omits `ad_account_id`
- `RUN_LIVE_META_TESTS`: set to `1` to enable live integration tests

Ad account selection:

- If the token has exactly one accessible ad account, the server resolves it automatically.
- If `META_DEFAULT_AD_ACCOUNT_ID` is set, the server uses it when `ad_account_id` is omitted.
- If the token has multiple accessible ad accounts, pass `ad_account_id` in the tool call.

## 2-minute smoke test

Use these first three tool calls to confirm the server is working:

1. `list_ad_accounts`
2. `list_campaigns`
3. `get_insights` with `level=campaign` and `date_preset=last_7d`

Example flow in Claude:

```text
Call list_ad_accounts
Call list_campaigns
Call get_insights with level=campaign and date_preset=last_7d
```

If the first call works but later calls fail, the issue is usually permissions or ad account scope.

If `list_campaigns` returns a selection request, call it again with one of the suggested `ad_account_id` values.

## Troubleshooting

| Problem | Likely cause | Fix |
| --- | --- | --- |
| Token missing | `META_ACCESS_TOKEN` is not set | Add the env var and restart Claude |
| Token invalid | Expired or wrong token | Generate a valid Meta read token |
| Permission denied | Missing `ads_read` or account access | Grant the token access to the ad account |
| Ambiguous ad account | Token can access multiple ad accounts | Pass `ad_account_id` per tool call |
| Rate limit errors | Meta API throttling | Retry later or reduce the number of insight calls |

## Development

Local development quickstart:

```bash
python -m pip install -e ".[dev]"
pytest -q
ruff check .
mypy src
```

If you want to run live Meta API tests:

```bash
RUN_LIVE_META_TESTS=1 pytest -q
```

## Release

Create and push a release tag:

```bash
git tag v0.1.10
git push origin v0.1.10
```

After release, users can run:

```bash
uvx flin-meta-ads-mcp
```

## Notes

- Use only ad accounts you are allowed to access
- This server is intended for analysis and reporting, not mutation
- Public users should treat `META_ACCESS_TOKEN` as a secret and supply it through environment variables only

TDQS

B3.4/5.0

Scored across 14 tools

Disambiguation5/5

Each tool targets a distinct entity and action: get/list for ad accounts, campaigns, adsets, ads, ad images, and ad creatives, plus dedicated preview and insights tools. There is no overlap or ambiguity between the tools.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using lowercase and underscores, with the verbs 'list' for collections and 'get' for single entities. This makes the tool surface predictable and easy to navigate.

Tool Count5/5

With 14 tools, the server is well-scoped for a read-only Meta Ads API. The count covers all major resources without being overwhelming or too sparse.

Completeness4/5

The server provides comprehensive read coverage for all major objects (accounts, campaigns, adsets, ads, images, creatives, preview, insights). The only noticeable gap is the lack of write operations (create/update/delete), but the server appears intentionally read-only based on the tool descriptions.

Maintenance

ActivitySlowing
ResponsivenessNo issues