A Model Context Protocol server for the Ocean Engine (巨量引擎) advertising platform. It exposes tools for querying advertisers, campaigns, ads and performance reports — and, when explicitly enabled, for mutating campaign status and budget.
Ocean Engine MCP server has solid naming conventions and visible input schemas defined via Go struct tags (jsonschema), but lacks several critical quality markers. All 6 tools follow verb_noun naming (oceanengine_get_*, oceanengine_list_*, oceanengine_update_*). Descriptions are present and moderately detailed (averaging ~120 chars), exceeding the 20-char minimum. Input schemas are explicitly registered via struct tags in server.go, providing type information and parameter descriptions. However, OUTPUT schemas are not documented, the code returns structured types (advertiserInfoOutput, oceanengine.CampaignList, etc.) but these types are not published in tool definitions or described in the tool documentation. Parameter descriptions are present but sometimes lack depth: 'page_size 1-100' is stated, but no example of when to use pagination is given. Error handling is present (advertiser_ids validation, required field checks) but error messages are basic and do not guide recovery or suggest alternatives. Write tools lack explicit confirmation/dry-run patterns, risking accidental mutation. Tool composition is clean, each tool has a single responsibility, though no batch variants are offered. Field naming between tools is consistent (advertiser_id, campaign_id, etc.). The server includes a feature flag (EnableWrites) for safe defaults (read-only by default), which is good practice.
Get Ocean Engine (巨量引擎) advertiser account information by advertiser ID.
Get an Ocean Engine (巨量引擎) ad performance report for a date range, grouped by the given dimensions.
List Ocean Engine (巨量引擎) ads (广告计划) for an advertiser, with pagination.
List Ocean Engine (巨量引擎) campaigns (广告组) for an advertiser, with pagination.
WRITE: set a new budget for an Ocean Engine (巨量引擎) campaign. This mutates the live account.
WRITE: enable, disable or delete Ocean Engine (巨量引擎) campaigns. This mutates the live account.
Output schemas not documented in tool definitions. Code returns structured types (advertiserInfoOutput, oceanengine.CampaignList, oceanengine.ReportResult, okOutput) but these types are not published in the tool definitions or described in tool documentation. LLMs cannot plan downstream use without knowing what fields are available.
Enum constraints stated only in descriptions, not formalized in JSON Schema. opt_status (update_campaign_status) and group_by/fields (get_report) are described with examples ('one of: enable, disable, delete' or '["STAT_GROUP_BY_FIELD_ID", ...]') but not declared as enum in the input schema. LLMs treat description examples as suggestions, not hard constraints, leading to invalid requests.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 67 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 40 | - | v1 |
Destructive write tools lack confirmation or dry-run patterns. oceanengine_update_campaign_status (with 'delete' action) and oceanengine_update_campaign_budget execute mutations immediately without an explicit confirmation step. Agents can accidentally delete campaigns or set budgets to unintended values.
Numeric parameter ranges not formally specified. budget parameter in oceanengine_update_campaign_budget has no min/max constraints; page/page_size constraints (1-100) are stated in descriptions only, not in JSON Schema minValue/maxValue fields. LLMs can pass invalid values (e.g., page_size=0, page_size=999, budget=-100).
Error messages are basic and do not guide recovery. Validation errors ('advertiser_ids must not be empty', 'advertiser_id is required') are actionable, but there is no guidance for API errors (e.g., 'advertiser not found' does not suggest alternative lookup calls). Error responses do not categorize failures as retryable, user-fixable, or fatal.
Pagination behavior not fully documented. list_campaigns and list_ads return paginated results but tool descriptions do not specify: whether total_count is included in response, whether next_cursor/next_page is available, or whether results are empty when page exceeds available data. This forces LLMs to guess pagination termination conditions.
Valid enumeration values not documented. group_by and fields parameters in get_report are shown as examples ('["STAT_GROUP_BY_FIELD_ID", "STAT_GROUP_BY_FIELD_STAT_TIME"]' and '["cost", "show", "click", "convert"]') but no complete list of valid values is provided. budget_mode in update_campaign_budget mentions 'defaults to BUDGET_MODE_DAY' but does not list other valid modes.
No batch variants offered. Tools like oceanengine_get_advertiser_info accept an array (advertiser_ids), but oceanengine_update_campaign_status requires a loop to update multiple campaigns. If an agent needs to update 10 campaigns, it makes 10 separate calls. A batch update_campaign_statuses would be more efficient.