You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit ff8366c
Browse filesBrowse the repository at this point in the historyBrowse files
Merge main into develop: bring 1.4.0 + 1.4.1 fixes (1.4.2)
main has shipped two fixes that develop never received:
- 1.4.0: MCP multi-account routing (silent matching[0] -> explicit error
with candidate list; account_id/profile_id params on posts_create /
posts_publish_now / posts_cross_post; accounts_get same fix)
- 1.4.1: autogenerated MCP tools no longer collapse OpenAPI array/object
schemas to str; $ref/allOf/single-type oneOf|anyOf wrappers are
dereferenced before reading the type
Without this merge, develop's next OpenAPI auto-regen would have
overwritten generated_tools.py against a buggy generator, silently
reintroducing the customer-facing bugs (Hein's Google Ads keywords
'Expected array, received string', and Pau's multi-account silent-routing).
Conflict resolution:
- generated SDK files (resources/_generated/*, generated_tools.py,
uv.lock): kept develop's newer content
- pyproject.toml: bumped to 1.4.2 so a future develop -> main merge
publishes a sensible version
- scripts/generate_mcp_tools.py: hand-merged develop's param +
tool_name dedupe with main's _resolve_schema / list-dict typing /
createPost-unblocked. Both fixes now coexist
- mcp/server.py + mcp/tool_definitions.py + tests/test_resolve_account.py:
took main's (multi-account fix)
- CHANGELOG: added 1.4.2 entry above the existing 1.4.1 / 1.4.0 entries
generated_tools.py was regenerated against develop's spec with the
merged generator. ads_create_standalone_ad now correctly types all 12
complex fields (4 from the customer report + 8 newer ones from develop's
spec). 166 tests pass.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+26Lines changed: 26 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,6 +7,32 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
## [Unreleased]
9
9
10
+
## [1.4.2]
11
+
12
+
### Fixed
13
+
- Merged the multi-account routing fix (1.4.0, originally landed on `main`) and the array/object schema fix (1.4.1, also `main`) into the `develop` branch so the next OpenAPI auto-regen doesn't reintroduce the bugs. Develop now has both fixes applied on top of its accumulated auto-regen content (new endpoints up through v1.3.120). No new behavioural changes beyond 1.4.1.
14
+
- Generator now combines `develop`'s param/tool-name dedupe (prevents duplicate-kwarg SyntaxErrors and F811 lint failures) with `main`'s `$ref`/`allOf` schema resolution and `list[T]`/`dict[str, Any]` typing. With develop's newer OpenAPI spec, this means newer fields on `ads_create_standalone_ad` (`cities`, `regions`, `creatives`, `images`, `video`, `brand_identity`, `promoted_object`) are now properly typed alongside the original four (`keywords`, `countries`, `additional_headlines`, `additional_descriptions`).
15
+
16
+
## [1.4.1]
17
+
18
+
### Fixed
19
+
-**Autogenerated MCP tools no longer collapse `array` and `object` schemas to `str`.** Fields like `keywords`, `countries`, `additional_headlines`, `additional_descriptions` on `ads_create_standalone_ad` (and the equivalents across every autogenerated tool) were declared as `str` and forwarded straight into the SDK, which then rejected the request with `Expected array, received string`. They now use the correct Python types (`list[str] | None`, `list[dict[str, Any]] | None`, `dict[str, Any] | None`) so FastMCP advertises the right shape to LLMs and the SDK receives native containers.
20
+
- The generator now dereferences `$ref`, `allOf`, and same-type `oneOf`/`anyOf` wrappers when reading a schema's type. Without this, properties like `posts_create_post.tiktokSettings`, `posts_create_post.facebookSettings`, `posts_create_post.recycling`, and array-of-$ref fields like `createWhatsAppTemplate.components`, `createQueueSlot.slots`, `sendConversions.events`, `updateGoogleBusinessFoodMenus.menus`, and `sendPrivateReplyToComment.buttons` would still have leaked through as `str`.
21
+
22
+
## [1.4.0]
23
+
24
+
### Fixed
25
+
-**MCP multi-account routing (silent-wrong-account bug).**`posts_create`, `posts_publish_now`, `posts_cross_post`, and `accounts_get` previously fell back to the first matching account (`matching[0]`) when the user had more than one account on the requested platform. Agency / multi-client setups could see posts land on the wrong account with no warning. These tools now return an explicit error listing the candidate account IDs when the selection is ambiguous, and require the caller to disambiguate.
26
+
27
+
### Added
28
+
-`account_id` and `profile_id` parameters on `posts_create` and `posts_publish_now` for explicit target selection.
29
+
-`account_ids` (parallel to `platforms`) and `profile_id` parameters on `posts_cross_post`. Repeating a platform with different IDs is supported (e.g. cross-posting to two Twitter accounts in one call).
30
+
-`posts_create_post` exposed as an autogenerated tool alongside the simplified `posts_create`. It mirrors the full REST `createPost` surface (nested `platforms` array with `customContent`, `customMedia`, `scheduledFor`, `platformSpecificData`) for power users who need per-target customisation.
31
+
- Top-level multi-account workflow guidance in the MCP server instructions so LLMs learn the disambiguation flow once globally.
32
+
- Unit tests for the shared `_resolve_account` helper covering account-id, profile-id, ambiguous, and not-found paths.
33
+
34
+
## [Older Unreleased entries]
35
+
10
36
### Added
11
37
- MCP HTTP server now exposes the modern **Streamable HTTP** transport at `POST /mcp` (in addition to the existing SSE transport at `GET /sse`). Streamable HTTP is recommended for new clients (Claude Code, `mcp-remote`, etc.) because it is not affected by the idle-connection drops that affect long-lived SSE connections behind proxies.
12
38
- Streamable HTTP runs in stateless mode — each request is fully independent and authenticated separately via the `Authorization: Bearer` header.
0 commit comments