Skip to main content
Glama
EfrainTorres

ArmaVita Meta Ads MCP

by EfrainTorres
README.md
# ArmaVita Meta Ads MCP

Manage Facebook, Instagram, and Threads ads from Claude Code, Codex, or another MCP-compatible assistant.

We built this for fast startup, low memory use, and broad advertising coverage in one local server.
**125 tools** cover campaigns, reporting, lead forms, catalogs, audiences, and more, with compact
responses and safeguards for sensitive changes. Related actions share tools to keep the list manageable.

It runs as a single executable with no Python environment to maintain and uses Meta Marketing API v26.

**Rust 2.0 release candidate:** smoke tested and heavily used internally.
Please [report any issues](https://github.com/EfrainTorres/armavita-meta-ads-mcp/issues) you run into.

## What you can do

| Area | Capabilities |
| --- | --- |
| Ads | Campaigns, ad sets, creatives, previews, budgets, schedules, and delivery checks |
| Reporting | Insights, filters, attribution settings, breakdowns, async reports, and change history |
| Leads | Create and archive Instant Forms, retrieve submissions, test leads, and manage webhook subscriptions |
| Audiences | Custom and lookalike audiences, saved-audience lookup, targeting, uploads, and sharing |
| Automation | Rules, A/B studies, value rules, and recommendations |
| Catalogs | Products, sets, feeds, batch updates, diagnostics, and catalog advertising settings |
| Creative assets | Account and Page media, playables, labels, and Instant Experiences |
| Engagement | Facebook/Instagram ad comments and supported Threads ad replies |
| Measurement and access | Pixels, datasets, CAPI, custom conversions, business assets, permissions, and publisher block lists |

Meta permissions and account eligibility still apply. [Setup and limitations](docs/SETUP.md).

## Why we rebuilt it in Rust

We rebuilt our [Python server](https://github.com/EfrainTorres/armavita-meta-ads-mcp/tree/python-legacy) for faster
startup, lower memory use, and a single executable with no Python environment to maintain.

| Metric | Python | Rust | Improvement |
| --- | ---: | ---: | ---: |
| Startup | 512 ms | 8.17 ms | **~63× faster** |
| Idle memory | 77.84 MiB | 16.30 MiB | **~79% less** |
| Runtime disk space | 45.7 MiB | 7.97 MiB | **~83% smaller** |

Original rewrite baseline, measured on macOS arm64 on August 20, 2026. Startup uses warm-run medians; loading tool definitions
was slower in this benchmark. [Full results and methodology](docs/BENCHMARKS.md).

The rebuild also keeps credentials out of tool calls and adds write plans you can review before
applying. [See what changed from Python](docs/MIGRATION.md).

## Get started

### 1. Install

Source builds require Rust 1.98.0, a C/C++ compiler, and CMake. From a checkout of the `rust` branch
or an extracted [source release](https://github.com/EfrainTorres/armavita-meta-ads-mcp/releases/tag/v2.0.0-rc.2):

```bash
cargo install --locked --path .
```

### 2. Authenticate

Set `META_ACCESS_TOKEN` in the environment used to launch your MCP client. Your token needs the
appropriate Meta permissions and access to the ad accounts you want to manage.

For browser login instead, set `META_APP_ID` and `META_APP_SECRET`, then run:

```bash
armavita-meta-ads-mcp --login
```

Browser login saves a private local token cache on macOS/Linux. On Windows, use `META_ACCESS_TOKEN`.
Never put credentials in prompts or committed configuration files.

### 3. Connect your assistant

For clients that use JSON MCP configuration, add:

```json
{
  "mcpServers": {
    "meta-ads-armavita": {
      "command": "armavita-meta-ads-mcp",
      "args": ["--transport=stdio"]
    }
  }
}
```

Claude Code can use the included [`.mcp.json`](.mcp.json). For Codex, use the
[TOML configuration example](docs/SETUP.md#client-configuration).

[Full setup guide](docs/SETUP.md): permissions, authentication, client settings, and media uploads.

## Before changing live ads

Keep write approvals enabled in your MCP client. Review mutation plans before applying them;
deletes require an explicit acknowledgement. The server never automatically retries a write.

Local uploads are off by default. Set `META_MEDIA_ROOT` to a folder you control to enable them.
See [security guidance](SECURITY.md) for details.

Coming from the Python version? Some tool names, inputs, and results have changed.
Read the [migration guide](docs/MIGRATION.md) before switching.

## License

Copyright (c) ArmaVita LLC. [GNU AGPLv3 only](LICENSE) (`AGPL-3.0-only`). Distributed without warranty.

TDQS

C2.4/5.0

Scored across 40 tools

Disambiguation4/5

Most tools are clearly distinct, targeting specific resources like ads, creatives, ad sets, campaigns, and targeting categories. However, some tools like 'search_web_content' and 'read_web_content' have ambiguous boundaries with other search/read tools, and 'create_report' overlaps in purpose with 'list_insights' for performance data, which could cause mild confusion.

Naming Consistency5/5

Tool names follow a highly consistent verb_noun pattern throughout, such as 'create_ad', 'list_campaigns', 'read_ad_account', 'update_ad_set', 'search_interests', and 'clone_ad_creative'. There are no deviations in naming conventions, making the set predictable and easy to parse.

Tool Count2/5

With 40 tools, the count is excessive for the apparent scope of Meta Ads management. This many tools can overwhelm agents and increase complexity, as typical well-scoped servers have 3-15 tools. It suggests over-fragmentation of operations that could be consolidated.

Completeness5/5

The tool surface provides comprehensive coverage for the Meta Ads domain, including full CRUD operations for ads, creatives, ad sets, and campaigns, along with reporting, audience estimation, targeting searches, and asset management. There are no obvious gaps, enabling agents to handle complete workflows without dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues