{"schema_version":"verify.report.v1","generated_at":"2026-06-18T11:55:40.768611+00:00","snapshot_id":"trustsnap_73b802bc52eceaf3","server":{"namespace":"io.github.getDynamoi","name":"dynamoi","title":"Dynamoi","description":"Promote music on Spotify and grow YouTube channels through AI-powered Meta and Google ad campaigns.","homepage_url":"https://dynamoi.com","docs_url":null,"icon_url":null,"support_url":null,"remote_url":"https://dynamoi.com/mcp","server_card_url":null,"latest_version":"0.4.0","current_status":"healthy","current_score":79.72,"transport_type":"streamable-http","has_oauth":true,"has_dcr":true,"has_prompts":true,"tool_count":22,"current_validation_schema_version":"16d1d270090d6c8f","last_validated_at":"2026-06-02T02:21:19.679672+00:00","registry_source":"official_registry","registry_identifier":"io.github.getDynamoi/dynamoi","canonical_identifier":"io.github.getDynamoi/dynamoi","current_score_components":{"auth_operability_score":4.0,"error_contract_score":3.0,"rate_limit_semantics_score":2.0,"schema_completeness_score":3.0,"backward_compatibility_score":4.0,"slo_health_score":3.0,"security_hygiene_score":4.0,"task_success_score":4.0,"trust_confidence_score":3.0,"abuse_noise_ratio_score":4.0,"prompt_contract_score":3.0,"resource_contract_score":4.0,"discovery_metadata_score":2.0,"registry_consistency_score":2.0,"installability_score":4.0,"session_semantics_score":4.0,"tool_surface_design_score":4.0,"result_shape_stability_score":4.0,"oauth_interop_score":4.0,"recovery_semantics_score":2.5,"maintenance_signal_score":3.0,"adoption_signal_score":3.0,"freshness_confidence_score":4.0,"transport_fidelity_score":4.0,"spec_recency_score":2.0,"session_resume_score":3.0,"step_up_auth_score":3.0,"transport_compliance_score":2.0,"utility_coverage_score":2.0,"advanced_capability_coverage_score":3.0,"connector_publishability_score":4.0,"tool_snapshot_churn_score":4.0,"connector_replay_score":4.0,"request_association_score":3.0,"interactive_flow_safety_score":4.0,"action_safety_score":2.0,"official_registry_presence_score":4.0,"provenance_divergence_score":4.0,"safety_transparency_score":3.0,"tool_capability_clarity_score":3.0,"destructive_operation_safety_score":3.0,"egress_ssrf_resilience_score":2.0,"execution_sandbox_safety_score":3.75,"data_exfiltration_resilience_score":2.0,"least_privilege_scope_score":3.0,"secret_handling_hygiene_score":2.0,"dependency_supply_chain_signal_score":2.0,"input_sanitization_safety_score":3.0,"tool_namespace_clarity_score":4.0},"capability_taxonomy":["development","search","communication","web","read","admin","export","monitoring","filesystem","finance","files","write","exec","secrets","cloud","network","security","automation","healthcare","oauth","dcr","prompts","resources","streamable_http"],"machine_summary":{"verdict":"needs_remediation","best_for":["OpenAI connectors","Claude Desktop","Smithery","Generic Streamable HTTP"],"avoid_if":["You need a production-approved server today.","You need a low-risk tool surface.","You cannot complete an authenticated client flow.","Validation evidence is outside TrustOps SLA"],"requires_auth":true,"supports_oauth":true,"risk_level":"high"},"taxonomy_tags":["development","search","communication","web"],"score_decomposition":[{"key":"access_protocol","label":"Access & Protocol","score":36.0,"max_score":44.0,"hint":"Connectivity, auth, and transport expectations for common clients.","components":[{"key":"auth_operability_score","score":4.0},{"key":"installability_score","score":4.0},{"key":"session_semantics_score","score":4.0},{"key":"transport_fidelity_score","score":4.0},{"key":"spec_recency_score","score":2.0},{"key":"session_resume_score","score":3.0},{"key":"step_up_auth_score","score":3.0},{"key":"transport_compliance_score","score":2.0},{"key":"request_association_score","score":3.0},{"key":"oauth_interop_score","score":4.0},{"key":"least_privilege_scope_score","score":3.0}]},{"key":"interface_quality","label":"Interface Quality","score":45.5,"max_score":56.0,"hint":"How well the tool/resource interface communicates and behaves under automation.","components":[{"key":"error_contract_score","score":3.0},{"key":"rate_limit_semantics_score","score":2.0},{"key":"schema_completeness_score","score":3.0},{"key":"prompt_contract_score","score":3.0},{"key":"resource_contract_score","score":4.0},{"key":"tool_surface_design_score","score":4.0},{"key":"tool_capability_clarity_score","score":3.0},{"key":"tool_namespace_clarity_score","score":4.0},{"key":"result_shape_stability_score","score":4.0},{"key":"utility_coverage_score","score":2.0},{"key":"advanced_capability_coverage_score","score":3.0},{"key":"tool_snapshot_churn_score","score":4.0},{"key":"connector_replay_score","score":4.0},{"key":"recovery_semantics_score","score":2.5}]},{"key":"security_posture","label":"Security Posture","score":25.75,"max_score":36.0,"hint":"How safely the exposed tool surface handles destructive actions, egress, execution, secrets, and risky inputs.","components":[{"key":"security_hygiene_score","score":4.0},{"key":"destructive_operation_safety_score","score":3.0},{"key":"egress_ssrf_resilience_score","score":2.0},{"key":"execution_sandbox_safety_score","score":3.75},{"key":"data_exfiltration_resilience_score","score":2.0},{"key":"secret_handling_hygiene_score","score":2.0},{"key":"input_sanitization_safety_score","score":3.0},{"key":"interactive_flow_safety_score","score":4.0},{"key":"action_safety_score","score":2.0}]},{"key":"reliability_trust","label":"Reliability & Trust","score":22.0,"max_score":24.0,"hint":"Operational stability, consistency, and trustworthiness over time.","components":[{"key":"backward_compatibility_score","score":4.0},{"key":"slo_health_score","score":3.0},{"key":"task_success_score","score":4.0},{"key":"trust_confidence_score","score":3.0},{"key":"abuse_noise_ratio_score","score":4.0},{"key":"freshness_confidence_score","score":4.0}]},{"key":"discovery_governance","label":"Discovery & Governance","score":20.0,"max_score":28.0,"hint":"How well the server is documented, listed, and governed in public registries.","components":[{"key":"discovery_metadata_score","score":2.0},{"key":"registry_consistency_score","score":2.0},{"key":"maintenance_signal_score","score":3.0},{"key":"safety_transparency_score","score":3.0},{"key":"dependency_supply_chain_signal_score","score":2.0},{"key":"official_registry_presence_score","score":4.0},{"key":"provenance_divergence_score","score":4.0}]},{"key":"adoption_market","label":"Adoption & Market","score":7.0,"max_score":8.0,"hint":"Adoption clues and public evidence that the server is intended for external use.","components":[{"key":"adoption_signal_score","score":3.0},{"key":"connector_publishability_score","score":4.0}]}],"validation_diff":{"latest_score":79.72,"previous_score":78.7,"score_delta":1.02,"latest_summary":"healthy","previous_summary":"healthy","summary_changed":false,"tool_count_delta":0,"prompt_count_delta":0,"resource_count_delta":0,"component_deltas":[{"key":"backward_compatibility_score","latest":4.0,"previous":2.0,"delta":2.0}],"regressed_checks":[],"improved_checks":[],"tool_snapshot_diff":{"snapshot_changed":false,"added_tools":[],"removed_tools":[],"required_arg_changes":[],"output_schema_drift":[]},"auth_mode_changed":false,"latest_auth_mode":"oauth_supported","previous_auth_mode":"oauth_supported","write_action_surface_expanded":false,"latest_high_risk_tools":11,"previous_high_risk_tools":11,"protocol_regressed":false,"latest_protocol_version":"2025-03-26","previous_protocol_version":"2025-03-26","registry_drift_changed":false,"latest_registry_drift":[],"previous_registry_drift":[],"connector_refresh_breaking":false,"previous_connector_refresh_breaking":false,"request_association_violation":false,"previous_request_association_violation":false},"tool_snapshot_diff":{"snapshot_changed":false,"added_tools":[],"removed_tools":[],"required_arg_changes":[],"output_schema_drift":[]},"connector_replay":{"status":"ok","backward_compatible":true,"would_break_after_refresh":false,"added_tools":[],"removed_tools":[],"required_arg_breaks":[],"output_breaks":[],"additive_output_changes":[]},"request_association":{"status":"missing","advertised_capabilities":[],"session_id_present":false,"protocol_version":null,"observed_methods":[],"violating_methods":[],"http_status":null,"issues":[]},"production_readiness":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first.","badge":"score-low","critical_alerts":0},"recommended_for":[{"label":"OpenAI connectors","reason":"OpenAI connectors is marked compatible with score 100."},{"label":"Claude Desktop","reason":"Claude Desktop is marked compatible with score 100."},{"label":"Smithery","reason":"Smithery is marked compatible with score 100."},{"label":"Generic Streamable HTTP","reason":"Generic Streamable HTTP is marked compatible with score 100."}],"history_summary":{"points":[{"timestamp":"2026-05-20T20:52:06.684918+00:00","score":78.19,"status":"healthy","latency_ms":1639.72,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-21T08:55:30.730323+00:00","score":78.7,"status":"healthy","latency_ms":1958.69,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-21T21:01:40.095515+00:00","score":78.7,"status":"healthy","latency_ms":2455.21,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-22T09:02:53.307445+00:00","score":78.7,"status":"healthy","latency_ms":1473.25,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-22T21:04:24.742940+00:00","score":78.7,"status":"healthy","latency_ms":1764.09,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-23T09:05:58.168336+00:00","score":78.7,"status":"healthy","latency_ms":1329.41,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-23T21:06:41.425693+00:00","score":78.7,"status":"healthy","latency_ms":1747.87,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-24T09:07:13.304668+00:00","score":78.7,"status":"healthy","latency_ms":2060.91,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-24T21:08:39.080358+00:00","score":78.7,"status":"healthy","latency_ms":1909.94,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-25T09:09:22.615075+00:00","score":79.21,"status":"healthy","latency_ms":1867.23,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-25T21:10:23.525104+00:00","score":79.21,"status":"healthy","latency_ms":2546.04,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-26T09:10:37.698118+00:00","score":79.72,"status":"healthy","latency_ms":2027.25,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-26T21:23:41.672179+00:00","score":79.72,"status":"healthy","latency_ms":1828.61,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-27T09:24:32.646829+00:00","score":79.72,"status":"healthy","latency_ms":2008.67,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-27T21:57:09.910094+00:00","score":79.72,"status":"healthy","latency_ms":2179.95,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-28T09:59:17.547013+00:00","score":79.72,"status":"healthy","latency_ms":1602.54,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-28T22:03:21.830600+00:00","score":79.72,"status":"healthy","latency_ms":1869.34,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-29T10:07:32.528596+00:00","score":79.72,"status":"healthy","latency_ms":1814.18,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-06-01T07:11:46.353440+00:00","score":78.7,"status":"healthy","latency_ms":3654.63,"tool_count":22,"prompt_count":6,"resource_count":15},{"timestamp":"2026-06-02T02:21:19.679672+00:00","score":79.72,"status":"healthy","latency_ms":2089.27,"tool_count":22,"prompt_count":6,"resource_count":15}],"status_counts":{"healthy":20},"score_delta_7d":0.0,"score_delta_30d":null,"avg_latency_ms":1991.34,"healthy_ratio_recent":1.0,"freshness_hours":393.57,"latest_status":"healthy"},"validation_timeline":[{"timestamp":"2026-06-02T02:21:19.679672+00:00","summary_status":"healthy","score":79.72,"protocol_version":"2025-03-26","auth_mode":"oauth_supported","tool_count":22,"prompt_count":6,"resource_count":15,"high_risk_tools":11,"safe_to_publish":true,"change_flags":[]},{"timestamp":"2026-06-01T07:11:46.353440+00:00","summary_status":"healthy","score":78.7,"protocol_version":"2025-03-26","auth_mode":"oauth_supported","tool_count":22,"prompt_count":6,"resource_count":15,"high_risk_tools":11,"safe_to_publish":true,"change_flags":["auth_mode_changed","write_surface_expanded","tool_snapshot_changed"]},{"timestamp":"2026-05-29T10:07:32.528596+00:00","summary_status":"healthy","score":79.72,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]},{"timestamp":"2026-05-28T22:03:21.830600+00:00","summary_status":"healthy","score":79.72,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]},{"timestamp":"2026-05-28T09:59:17.547013+00:00","summary_status":"healthy","score":79.72,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]},{"timestamp":"2026-05-27T21:57:09.910094+00:00","summary_status":"healthy","score":79.72,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]},{"timestamp":"2026-05-27T09:24:32.646829+00:00","summary_status":"healthy","score":79.72,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]},{"timestamp":"2026-05-26T21:23:41.672179+00:00","summary_status":"healthy","score":79.72,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]},{"timestamp":"2026-05-26T09:10:37.698118+00:00","summary_status":"healthy","score":79.72,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]},{"timestamp":"2026-05-25T21:10:23.525104+00:00","summary_status":"healthy","score":79.21,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]},{"timestamp":"2026-05-25T09:09:22.615075+00:00","summary_status":"healthy","score":79.21,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]},{"timestamp":"2026-05-24T21:08:39.080358+00:00","summary_status":"healthy","score":78.7,"protocol_version":null,"auth_mode":"unknown","tool_count":0,"prompt_count":0,"resource_count":0,"high_risk_tools":0,"safe_to_publish":false,"change_flags":[]}],"evidence_confidence":{"score":65.0,"label":"medium","reason":"Based on 20 recent validations, 26 captured checks, and validation age of 393.6 hours.","live_check_count":26,"validation_age_hours":393.57},"incident_feed":[{"type":"validation_snapshot","timestamp":"2026-06-02T02:21:19.679672+00:00","title":"Latest validation: healthy","message":"Score 79.7 with status healthy."},{"type":"score_change","timestamp":"2026-06-02T02:21:19.679672+00:00","title":"Score changed","message":"Score delta +1.0 versus the previous run."},{"type":"score_change","timestamp":"2026-06-01T07:11:46.353440+00:00","title":"Score changed","message":"Score delta -1.0 versus the previous run."},{"type":"tool_snapshot_change","timestamp":"2026-06-01T07:11:46.353440+00:00","title":"Tool snapshot changed","message":"Added 22, removed 0, and changed 0 tool contracts."},{"type":"auth_mode_change","timestamp":"2026-06-01T07:11:46.353440+00:00","title":"Auth mode changed","message":"Auth mode moved from unknown to oauth_supported."}],"remediations":[{"code":"add_confirmation_semantics","severity":"high","title":"Add confirmation and dry-run semantics for risky actions","why":"High-risk write, delete, exec, or egress tools should communicate safeguards clearly.","action":"Inspect the latest validation evidence and resolve the client-visible regression.","playbook":["Inspect the latest validation evidence.","Resolve the highest-severity client-facing gap first.","Revalidate and confirm the score and verdict improve."],"maintainer_context":null},{"code":"fix_transport_compliance","severity":"high","title":"Align session and protocol behavior with Streamable HTTP expectations","why":"Clients increasingly rely on MCP-Protocol-Version, session teardown, and expired-session semantics.","action":"Align MCP-Protocol-Version, MCP-Session-Id, DELETE teardown, and expired-session handling with the transport spec.","playbook":["Return `Mcp-Session-Id` and `Mcp-Protocol-Version` headers consistently on streamable HTTP responses.","Honor `DELETE` session teardown and return `404` when a deleted session is reused.","Reject invalid protocol-version headers with `400 Bad Request`."],"maintainer_context":null},{"code":"enforce_request_association","severity":"high","title":"Associate roots, sampling, and elicitation with active client requests","why":"Modern MCP guidance expects roots, sampling, and elicitation traffic to be tied to an active client request instead of arriving unsolicited on idle sessions.","action":"Inspect the latest validation evidence and resolve the client-visible regression.","playbook":["Inspect the latest validation evidence.","Resolve the highest-severity client-facing gap first.","Revalidate and confirm the score and verdict improve."],"maintainer_context":null},{"code":"update_protocol_version","severity":"medium","title":"Adopt a current MCP protocol revision","why":"Older protocol revisions reduce compatibility with newer clients and registry programs.","action":"Inspect the latest validation evidence and resolve the client-visible regression.","playbook":["Inspect the latest validation evidence.","Resolve the highest-severity client-facing gap first.","Revalidate and confirm the score and verdict improve."],"maintainer_context":null},{"code":"tighten_step_up_auth","severity":"medium","title":"Document minimal scopes and return cleaner auth challenges","why":"Modern clients expect granular scopes and step-up auth signals such as WWW-Authenticate scope hints.","action":"Return granular scopes and WWW-Authenticate challenge hints instead of forcing overly broad auth upfront.","playbook":["Advertise the narrowest viable scopes in OAuth metadata.","Return `WWW-Authenticate` challenges with scope or insufficient-scope hints when additional consent is needed.","Revalidate with both public discovery and auth-required flows."],"maintainer_context":null},{"code":"respond_validation_stale","severity":"medium","title":"Respond to validation evidence is outside trustops sla","why":"Latest validation is 393.6 hours old, beyond the configured 24h TrustOps alert threshold.","action":"Trigger a fresh validation run or raise scheduler priority when this server must meet the TrustOps alert threshold.","playbook":["Queue a new validation run now.","Inspect whether the scheduler priority should be raised for this server.","Do not treat evidence outside the TrustOps alert threshold as a fresh production decision without review."]},{"code":"repair_session_resume","severity":"medium","title":"Support resumable HTTP sessions cleanly","why":"Modern MCP clients increasingly expect resumable session behavior on streamable HTTP transports.","action":"Inspect the latest validation evidence and resolve the client-visible regression.","playbook":["Inspect the latest validation evidence.","Resolve the highest-severity client-facing gap first.","Revalidate and confirm the score and verdict improve."],"maintainer_context":null}],"client_remediation_modes":[{"key":"openai_connectors","label":"ChatGPT custom connector","status":"ready","why_not_ready":[{"label":"search fetch only is not yet satisfied","state":"blocked"},{"label":"admin refresh required is not yet satisfied","state":"blocked"},{"label":"safe for company knowledge is not yet satisfied","state":"blocked"},{"label":"safe for messages api remote mcp is not yet satisfied","state":"blocked"},{"label":"Transport compliance issues should be resolved before wider client rollout.","state":"blocked"}],"maintainer_context":null},{"key":"claude_desktop","label":"Claude remote MCP","status":"ready","why_not_ready":[{"label":"search fetch only is not yet satisfied","state":"blocked"},{"label":"admin refresh required is not yet satisfied","state":"blocked"},{"label":"safe for company knowledge is not yet satisfied","state":"blocked"},{"label":"safe for messages api remote mcp is not yet satisfied","state":"blocked"},{"label":"Transport compliance issues should be resolved before wider client rollout.","state":"blocked"}],"maintainer_context":null},{"key":"write_safe","label":"Write-safe publishing","status":"ready","why_not_ready":[],"maintainer_context":null}],"client_profiles":[{"key":"openai_connectors","label":"OpenAI Connectors","score":100.0,"compatibility":"compatible","missing_requirements":[],"snippet":"Connector URL: https://dynamoi.com/mcp\n# Complete OAuth in the client when prompted.\n# Server: io.github.getDynamoi/dynamoi"},{"key":"claude_desktop","label":"Claude Desktop","score":100.0,"compatibility":"compatible","missing_requirements":[],"snippet":"{\n  \"mcpServers\": {\n    \"dynamoi\": {\n      \"command\": \"npx\",\n      \"args\": [\"mcp-remote\", \"https://dynamoi.com/mcp\"]\n    }\n  }\n}"},{"key":"smithery","label":"Smithery","score":100.0,"compatibility":"compatible","missing_requirements":[],"snippet":"smithery mcp add \"https://dynamoi.com/mcp\""},{"key":"generic_streamable_http","label":"Generic Streamable HTTP","score":100.0,"compatibility":"compatible","missing_requirements":[],"snippet":"curl -sS https://dynamoi.com/mcp -H 'content-type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-03-26\",\"capabilities\":{},\"clientInfo\":{\"name\":\"mcp-verify\",\"version\":\"0.1.0\"}}}'"}],"client_readiness_verdicts":[{"key":"openai_connectors","label":"Client compatibility: ChatGPT","status":"ready","reason":"No major blockers detected.","evidence":[{"check":"initialize","status":"ok","source":"live_validation","note":null,"http_status":200},{"check":"tools_list","status":"ok","source":"live_validation","note":null,"http_status":200},{"check":"transport_compliance_probe","status":"warning","source":"live_validation","note":null,"http_status":null},{"check":"step_up_auth_probe","status":"warning","source":"live_validation","note":null,"http_status":null},{"check":"connector_replay_probe","status":"ok","source":"live_validation","note":"Frozen tool snapshots must survive refresh.","http_status":null},{"check":"request_association_probe","status":"missing","source":"live_validation","note":"Roots, sampling, and elicitation should stay request-scoped.","http_status":null}],"confidence":{"score":65.0,"label":"medium"},"source_resolution":{"winner":"live_validation","supporting_sources":["live_validation","history","server_card"],"disagreements":[]}},{"key":"claude_desktop","label":"Client compatibility: Claude","status":"ready","reason":"No major blockers detected.","evidence":[{"check":"initialize","status":"ok","source":"live_validation","note":null,"http_status":200},{"check":"tools_list","status":"ok","source":"live_validation","note":null,"http_status":200},{"check":"transport_compliance_probe","status":"warning","source":"live_validation","note":null,"http_status":null}],"confidence":{"score":65.0,"label":"medium"},"source_resolution":{"winner":"live_validation","supporting_sources":["live_validation","history","server_card"],"disagreements":[]}},{"key":"unsafe_for_write_actions","label":"Write-action publishing","status":"no","reason":"Current write surface is bounded enough for cautious review with production policy controls.","evidence":[{"check":"action_safety_probe","status":"warning","source":"live_validation","note":null,"http_status":null}],"confidence":{"score":65.0,"label":"medium"},"source_resolution":{"winner":"live_validation","supporting_sources":["live_validation","history"],"disagreements":[]}},{"key":"snapshot_churn_risk","label":"Snapshot churn risk","status":"low","reason":"No material tool-surface churn detected in the latest comparison.","evidence":[{"check":"tool_snapshot_probe","status":"ok","source":"live_validation","note":null,"http_status":null},{"check":"connector_replay_probe","status":"ok","source":"live_validation","note":null,"http_status":null}],"confidence":{"score":65.0,"label":"medium"},"source_resolution":{"winner":"history","supporting_sources":["history","live_validation"],"disagreements":[]}}],"publishability_policy_profiles":[{"key":"chatgpt_custom_connector","label":"ChatGPT custom connector compatibility","status":"ready","gates":{"search_fetch_only":false,"write_actions_present":true,"oauth_configured":true,"admin_refresh_required":false,"safe_for_company_knowledge":false,"safe_for_messages_api_remote_mcp":false},"reason":"Remote MCP, auth, transport, and tool-surface checks are in acceptable shape."},{"key":"claude_remote_mcp","label":"Claude remote MCP compatibility","status":"ready","gates":{"search_fetch_only":false,"write_actions_present":true,"oauth_configured":true,"admin_refresh_required":false,"safe_for_company_knowledge":false,"safe_for_messages_api_remote_mcp":false},"reason":"Transport, discovery, and remote-MCP assumptions are satisfied."}],"compatibility_fixtures":[{"key":"chatgpt_custom_connector","label":"ChatGPT custom connector fixture","status":"passes","assumptions":[{"name":"remote_http_endpoint","status":"passes"},{"name":"oauth_discovery","status":"passes"},{"name":"frozen_tool_snapshot_refresh","status":"passes"},{"name":"request_association","status":"passes"}],"reason":"Live checks line up with current ChatGPT connector assumptions."},{"key":"anthropic_remote_mcp","label":"Anthropic remote MCP fixture","status":"passes","assumptions":[{"name":"remote_transport","status":"passes"},{"name":"tool_discovery","status":"passes"},{"name":"auth_connect","status":"passes"},{"name":"safe_write_review","status":"passes"}],"reason":"Remote MCP transport and discovery assumptions are satisfied."}],"install_snippets":{"openai_connectors":"Connector URL: https://dynamoi.com/mcp\n# Complete OAuth in the client when prompted.\n# Server: io.github.getDynamoi/dynamoi","claude_desktop":"{\n  \"mcpServers\": {\n    \"dynamoi\": {\n      \"command\": \"npx\",\n      \"args\": [\"mcp-remote\", \"https://dynamoi.com/mcp\"]\n    }\n  }\n}","smithery":"smithery mcp add \"https://dynamoi.com/mcp\"","generic_http":"curl -sS https://dynamoi.com/mcp -H 'content-type: application/json' -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-03-26\",\"capabilities\":{},\"clientInfo\":{\"name\":\"mcp-verify\",\"version\":\"0.1.0\"}}}'"},"aliases":[{"identifier":"io.github.getDynamoi/dynamoi","registry_source":"official_registry","remote_url":"https://dynamoi.com/mcp","canonical":true,"score":79.72},{"identifier":"dynamoi/music-youtube-marketing-mcp","registry_source":"smithery_registry","remote_url":null,"canonical":false,"score":45.93},{"identifier":"github-getdynamoi/mcp","registry_source":"github_topic_registry","remote_url":null,"canonical":false,"score":45.42}],"raw_evidence":{"server_identifier":"io.github.getDynamoi/dynamoi","remote_url":"https://dynamoi.com/mcp","server_card_payload":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","description":"Create free Smart Links and artist hubs from Spotify, view link and campaign analytics, and manage Dynamoi music and YouTube campaigns.","name":"io.github.getDynamoi/dynamoi","packages":[{"identifier":"@dynamoi/mcp","registryType":"npm","transport":{"type":"streamable-http","url":"https://dynamoi.com/mcp"},"version":"0.6.4"}],"remotes":[{"type":"streamable-http","url":"https://dynamoi.com/mcp"}],"repository":{"source":"github","subfolder":"packages/mcp","url":"https://github.com/getDynamoi/mcp"},"title":"Dynamoi","version":"0.6.4","websiteUrl":"https://dynamoi.com"},"checks":{"server_card":{"status":"ok","latency_ms":112.91,"details":{"url":"https://dynamoi.com/.well-known/mcp/server-card.json","payload":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","description":"Create free Smart Links and artist hubs from Spotify, view link and campaign analytics, and manage Dynamoi music and YouTube campaigns.","name":"io.github.getDynamoi/dynamoi","packages":[{"identifier":"@dynamoi/mcp","registryType":"npm","transport":{"type":"streamable-http","url":"https://dynamoi.com/mcp"},"version":"0.6.4"}],"remotes":[{"type":"streamable-http","url":"https://dynamoi.com/mcp"}],"repository":{"source":"github","subfolder":"packages/mcp","url":"https://github.com/getDynamoi/mcp"},"title":"Dynamoi","version":"0.6.4","websiteUrl":"https://dynamoi.com"},"http_status":200,"headers":{"content-type":"application/json; charset=utf-8"}}},"oauth_protected_resource":{"status":"ok","latency_ms":18.64,"details":{"url":"https://dynamoi.com/.well-known/oauth-protected-resource","payload":{"authorization_servers":["https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1"],"bearer_methods_supported":["header"],"resource":"https://dynamoi.com/mcp","resource_documentation":"https://dynamoi.com/docs/mcp-server","scopes_supported":["email","profile"]},"http_status":200,"headers":{"content-type":"application/json; charset=utf-8"}}},"oauth_authorization_server":{"status":"ok","latency_ms":158.82,"details":{"url":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/.well-known/oauth-authorization-server","payload":{"issuer":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1","authorization_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/authorize","token_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/token","jwks_uri":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/.well-known/jwks.json","userinfo_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/userinfo","registration_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/clients/register","scopes_supported":["openid","profile","email","phone"],"response_types_supported":["code"],"response_modes_supported":["query"],"grant_types_supported":["authorization_code","refresh_token"],"subject_types_supported":["public"],"id_token_signing_alg_values_supported":["RS256","HS256","ES256"],"token_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post","none"],"claims_supported":["sub","aud","iss","exp","iat","auth_time","nonce","email","email_verified","phone_number","phone_number_verified","name","picture","preferred_username","updated_at"],"code_challenge_methods_supported":["S256","plain"]},"http_status":200,"headers":{"content-type":"application/json","strict-transport-security":"max-age=31536000; includeSubDomains; preload","set-cookie":"__cf_bm=yqe8EXRsSBbUK0LQ3ijP070Db5HlMwoRlU9xHkX.vD0-1780366877.7414494-1.0.1.1-BVtRpfDfLGLMrPo3C1Z_uJ.RsRcDypytISGCvGUGfzwBS2i.PRmT8ayq0N18ziqbKBDI7Cw..z_z0gsZHUEcctitx8FPYIVJG4NLvskNUrDkrUnLYbFTR5EfuMxSG8jC; HttpOnly; SameSite=None; Secure; Path=/; Domain=supabase.co; Expires=Tue, 02 Jun 2026 02:51:17 GMT"}}},"openid_configuration":{"status":"ok","latency_ms":28.44,"details":{"url":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/.well-known/openid-configuration","payload":{"issuer":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1","authorization_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/authorize","token_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/token","jwks_uri":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/.well-known/jwks.json","userinfo_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/userinfo","registration_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/clients/register","scopes_supported":["openid","profile","email","phone"],"response_types_supported":["code"],"response_modes_supported":["query"],"grant_types_supported":["authorization_code","refresh_token"],"subject_types_supported":["public"],"id_token_signing_alg_values_supported":["RS256","HS256","ES256"],"token_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post","none"],"claims_supported":["sub","aud","iss","exp","iat","auth_time","nonce","email","email_verified","phone_number","phone_number_verified","name","picture","preferred_username","updated_at"],"code_challenge_methods_supported":["S256","plain"]},"http_status":200,"headers":{"content-type":"application/json","strict-transport-security":"max-age=31536000; includeSubDomains; preload"}}},"initialize":{"status":"ok","latency_ms":305.04,"details":{"url":"https://dynamoi.com/mcp","payload":{"result":{"protocolVersion":"2025-03-26","capabilities":{"tools":{"listChanged":true},"prompts":{"listChanged":true},"resources":{"listChanged":true}},"serverInfo":{"name":"dynamoi","version":"0.6.4","websiteUrl":"https://dynamoi.com"},"instructions":"You are operating Dynamoi's tools on behalf of the authenticated user. Dynamoi helps\nmusic artists promote on Spotify and YouTube creators grow channels through managed\nMeta and Google ad campaigns. Smart Links are free to create and manage. High-popularity\nor unverifiable artist links may stay unpublished in verification hold until Dynamoi\ncan verify the client relationship. Managed advertising and ad budgets are separate\npaid campaign services.\n\n=== Session Start Routine ===\n\nWhen the user's first message in a Dynamoi session is account-relevant (artists, campaigns, smart links, billing, connections, launches, or \"what should I do here\"), call dynamoi_get_account_overview first to learn the user's state. The response includes a recommendedNextActions array and a state object — treat that array as authoritative guidance for what to ask or do next.\n\nRoute by state from dynamoi_get_account_overview:\n\n- state.hasAnyArtist === false: This is a brand-new user. Ask whether they are a Spotify artist, a YouTube creator, or a label/manager.\n  - Spotify artist with a URL → call dynamoi_create_smart_links_from_spotify_artist immediately to create their free hub. Read dynamoi://playbooks/spotify-artist for scripted phrasing.\n  - YouTube creator → read dynamoi://playbooks/youtube-creator and explain Dynamoi's revenue-per-view optimization advantage before asking whether they want to link the channel. If yes, call dynamoi_start_youtube_channel_link.\n  - Label or manager with a roster → read dynamoi://playbooks/label-or-manager for the multi-artist setup walkthrough.\n\n- state.hasAnyArtist === true && state.hasAnySmartLink === false: The fastest visible win is a free Smart Link. Offer dynamoi_create_smart_link_from_spotify (single release) or dynamoi_create_smart_links_from_spotify_artist (full catalog) before campaign tools.\n\n- state.hasAnyArtist === true && state.hasAnyActiveCampaign === false: Offer dynamoi_get_campaign_readiness to validate launch inputs without creating anything.\n\n- state.hasAnyArtist === true && billing blocks a launch: tell the user managed-advertising billing setup must happen in the Dynamoi dashboard, not through a ChatGPT checkout link. After they start or restore billing there, poll dynamoi_get_billing for the target artist to confirm billing is active.\n\n- state.hasAnyArtist === true && state.hasAnyConnectedMeta === false and the user wants Spotify Smart Campaigns: only offer dynamoi_start_meta_connection after billing is active. If the tool returns billing_required, route the user to dashboard billing first. If it returns billing_check_unavailable, retry shortly instead of treating the user as unpaid. After Meta browser return, poll dynamoi_get_platform_status for the target artist with the returned onboardingAttemptId and onboardingFlow=meta. Treat platforms.meta.status as complete when it is oauth_complete, partnership_pending, or partnership_active.\n\n- state.hasAnyArtist === true && state.hasAnyConnectedYoutube === false and the user wants YouTube growth: offer dynamoi_start_youtube_channel_link, then poll dynamoi_get_platform_status for the target artist with the returned onboardingAttemptId and onboardingFlow=youtube after the browser return page sends them back to chat. Treat the connection as complete when platforms.youtube.connected is true.\n\nDo NOT call dynamoi_list_artists or dynamoi_search as a first step for brand-new users — both will return empty for them and the conversation stalls. Always go through dynamoi_get_account_overview first.\n\n=== End Session Start Routine ===\n\nPrinciples:\n- Be accurate. If uncertain, ask a clarifying question before acting.\n- Answer general knowledge or advice questions directly without Dynamoi tools unless the user is asking about their Dynamoi account, artists, campaigns, billing, connections, or launches.\n- Do not call Dynamoi tools just to \"check context\" before answering generic advice questions. If the question is about Instagram growth, lyrics, songwriting, promotion strategy, or general marketing education and does not require the user's account data, answer natively and do not mention inspecting Dynamoi.\n- Even when Dynamoi is attached, generic advice stays native. If the user asks something like \"How do I get more followers on Instagram organically without running any ads?\", answer directly with no Dynamoi tool calls.\n- `dynamoi_get_account_overview` is only for explicit account-overview questions. Do not use it as a zero-context scout before answering unrelated prompts.\n- Never claim you changed something unless the tool returned status \"success\" or\n  \"partial_success\".\n- Prefer read tools first before write tools. For writes, confirm intent and restate\n  what will change.\n- After a successful write tool call, answer directly from the returned record instead of chaining more tools just to restate the result.\n- If you truly need a follow-up read after a successful write, use format=summary when available and then stop to answer the user.\n- When a user asks for a daily breakdown, pass granularity=DAILY on the analytics tool call.\n- When a user asks for a written rollup, strongest campaign, or review-ready analytics summary, prefer format=summary on the analytics tool call.\n- If a read tool already returned the requested answer in summary form, answer the user directly instead of chaining more read tools.\n- When a user asks to create a shareable release link, landing page, link-in-bio destination, streaming link, Spotify link page, or free promotion asset, prefer Smart Link tools before campaign tools. Use dynamoi_create_smart_links_from_spotify_artist for Spotify artist URLs when the user wants the artist hub, full catalog, or all Smart Links. Use dynamoi_create_smart_link_from_spotify for a single album or track URL. Do not imply that creating a Smart Link creates a paid campaign.\n- When answering from Smart Link tools, lead with the artist hub URL when present, then public release URLs, release title, artist name, status, and next action. Do not include internal UUIDs unless the user explicitly asks for IDs or you need an ID for a follow-up tool call.\n- Smart Link pixel tools accept validated pixel IDs only. Do not ask for arbitrary JavaScript, tag-manager snippets, or script code.\n- Money values are shown in USD as presented in Dynamoi.\n- Budget minimums: $10/day (daily), $100 total (Smart Campaign), $50 total (YouTube).\n- Product and pricing details are available as MCP resources. Keep runtime answers\n  focused on the user's account data and requested action.\n\nCommon workflows:\n- Discovery: dynamoi_list_artists → dynamoi_list_campaigns → dynamoi_get_campaign →\n  dynamoi_get_campaign with includeAnalytics=true when needed\n- Artist performance summary: dynamoi_get_artist_analytics with granularity=DAILY when requested. If that response already includes the strongest campaign, do not call more analytics tools.\n- Diagnose stuck campaign: dynamoi_get_campaign → dynamoi_get_platform_status →\n  propose next steps\n- Pause/resume: dynamoi_get_campaign (confirm) → dynamoi_update_campaign with action=pause or action=resume\n- Budget update: dynamoi_get_campaign (confirm) → dynamoi_update_campaign with action=update_budget\n- Launch: dynamoi_list_media_assets → dynamoi_launch_campaign\n- Free Smart Link artist catalog creation: dynamoi_create_smart_links_from_spotify_artist; omit artistId for a brand-new user with no Dynamoi artist yet\n- Free Smart Link single-release creation: dynamoi_list_artists → dynamoi_create_smart_link_from_spotify\n- Smart Link analytics/settings: dynamoi_list_smart_links → dynamoi_get_smart_link with includeAnalytics=true or includeArtistSettings=true\n- Post-launch answer: if dynamoi_launch_campaign succeeds, answer from that result directly. Only call dynamoi_get_campaign when the user explicitly needs more detail than the launch result already returned, and prefer format=summary for that follow-up.\n- Review/demo Smart Campaign launch: if the user already gave artist, content title, budget, countries, and reusable media assets, you may call dynamoi_launch_campaign without spotifyUrl/endDate because Dynamoi can infer reviewer-safe defaults. Do not invent placeholder values for omitted fields; omit those keys entirely."},"jsonrpc":"2.0","id":1},"http_status":200,"headers":{"content-type":"text/event-stream","strict-transport-security":"max-age=63072000; includeSubDomains; preload"}}},"protocol_version_probe":{"status":"warning","latency_ms":null,"details":{"claimed_version":"2025-03-26","validator_protocol_version":"2025-03-26","latest_known_version":"2025-11-25","releases_behind":2,"lag_days":244}},"tools_list":{"status":"ok","latency_ms":285.93,"details":{"url":"https://dynamoi.com/mcp","payload":{"result":{"tools":[{"name":"dynamoi_get_account_overview","title":"Get Account Overview","description":"Use this when the user explicitly asks about the signed-in Dynamoi account itself, such as who is logged in, how many organizations or artists it can access, or whether account-level platform connections exist. Always pass intent to match that explicit account question. Do not use this to confirm a specific Meta or YouTube onboarding attempt because this account-level state can span multiple artists; use dynamoi_get_platform_status for the target artist instead. Do not use this to enumerate artists one by one; use dynamoi_list_artists for that. Never use this to 'check context' before answering generic Instagram, lyrics, songwriting, or marketing-advice questions, even if Dynamoi is attached.","inputSchema":{"type":"object","properties":{"format":{"type":"string","enum":["json","summary"]},"intent":{"type":"string","enum":["account_overview","artist_access_check","organization_access_check","platform_connection_check"]}},"required":["intent"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_artists","title":"List Artists","description":"Use this when the user wants to see which artists or YouTube channels they manage, along with billing status, active campaign count, and their role. Pass artistId when you need the full profile/readiness details for one artist instead of a roster page. Do not use this for campaign details; use dynamoi_list_campaigns or dynamoi_get_campaign. Never use this for generic social-media or marketing advice, including Instagram follower-growth questions, unless the user explicitly asked about their Dynamoi roster. If the result is empty, the user is brand-new — do not stop with 'no records found'; route through dynamoi_get_account_overview.recommendedNextActions.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"limit":{"type":"integer","minimum":1,"maximum":50}},"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_search","title":"Search Dynamoi","description":"Use this when the user mentions an artist, release, campaign, or smart link but you do not yet know the exact record to inspect. Do not use this for analytics summaries or billing questions once you already know the target record. If the result is empty for a brand-new user (no artists yet), do not respond 'no records found' as a terminal answer — instead suggest creating their first artist hub via dynamoi_create_smart_links_from_spotify_artist.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"includeArchived":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":50},"query":{"type":"string","maxLength":120},"type":{"type":"string","enum":["artist","campaign","smartlink"]}},"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"search","title":"Search (OpenAI Connectors)","description":"OpenAI ChatGPT Deep Research / Connectors search contract. Returns matching Dynamoi artists, campaigns, and Smart Links so they can be cited in a deep-research session. For regular ChatGPT chat use dynamoi_search instead.","inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":500}},"required":["query"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"fetch","title":"Fetch (OpenAI Connectors)","description":"OpenAI ChatGPT Deep Research / Connectors fetch contract. Given an id returned by `search` (formatted as 'artist:<uuid>', 'campaign:<uuid>', or 'smartlink:<uuid>'), returns the full record for citation.","inputSchema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200}},"required":["id"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_campaigns","title":"List Campaigns","description":"Use this when the user wants to browse campaigns for one artist, optionally filtered by type or status. Do not use this for a single campaign deep dive; use dynamoi_get_campaign for that. Never use this to personalize generic marketing advice. If the user has no artists yet, do not call this — route via dynamoi_get_account_overview first.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"campaignType":{"type":"string","enum":["SMART_CAMPAIGN","YOUTUBE"]},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"limit":{"type":"integer","minimum":1,"maximum":50},"status":{"type":"string","enum":["AWAITING_SMART_LINK","ACTIVE","ARCHIVED","CONTENT_VALIDATION","DEPLOYING","FAILED","PAUSED","READY_FOR_REVIEW","SUBSCRIPTION_PAUSED"]}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_campaign","title":"Get Campaign","description":"Use this when the user wants full details for one campaign, including budget, targeting, platform status, and next actions. Set includeAnalytics=true for one-campaign performance, includeDeploymentStatus=true for delivery/deployment blockers, and includeCountries=true only when the full country list is needed. Do not use this for a campaign list; use dynamoi_list_campaigns instead. After a successful launch or campaign mutation, prefer format=summary when you need a follow-up read to relay the final answer.","inputSchema":{"type":"object","properties":{"analyticsDateRange":{"type":"object","properties":{"end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["end","start"],"additionalProperties":false},"analyticsGranularity":{"type":"string","enum":["TOTAL","DAILY"]},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"includeAnalytics":{"type":"boolean"},"includeCountries":{"type":"boolean"},"includeDeploymentStatus":{"type":"boolean"}},"required":["campaignId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_artist_analytics","title":"Get Artist Analytics","description":"Use this when the user wants artist-level performance across all campaigns, including 30-day rollups or daily breakdowns. Pass granularity=DAILY when the user asks for a daily breakdown. Pass format=summary when the user wants a written rollup, a strongest-campaign verdict, or a direct answer you can relay immediately. If this tool already returned the requested strongest-campaign comparison, stop and answer instead of calling more analytics tools. For one campaign's metrics, use dynamoi_get_campaign with includeAnalytics=true.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"dateRange":{"type":"object","properties":{"end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["end","start"],"additionalProperties":false},"format":{"type":"string","enum":["json","summary"]},"granularity":{"type":"string","enum":["TOTAL","DAILY"]}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_billing","title":"Get Billing","description":"Use this when the user asks about billing state, credit balance, promo limits, subscription status, or whether billing blocks launches for one artist. This is a read-only status check; it does not create checkout links or collect payment. If billing blocks a launch, direct the user to start or restore managed advertising in the Dynamoi dashboard, then call this tool again to confirm the status. Do not use this for campaign analytics or platform connection troubleshooting.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"onboardingAttemptId":{"type":"string","minLength":1,"maxLength":120}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_platform_status","title":"Get Platform Status","description":"Use this when the user wants to know whether Spotify, Meta, or YouTube are connected and what setup steps still block launches. When polling after a connection-start flow, pass the returned onboardingAttemptId and onboardingFlow so Dynamoi ops can correlate the browser step. Do not use this for detailed billing questions. Never use this to personalize generic Instagram or marketing-advice questions.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"onboardingAttemptId":{"type":"string","minLength":1,"maxLength":120},"onboardingFlow":{"type":"string","enum":["meta","youtube"]}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_available_countries","title":"List Available Countries","description":"Use this when the user asks which countries they can target for a Smart Campaign or YouTube campaign. Always pass campaignType because Smart Campaign and YouTube country catalogs are different. Do not use this for generic country marketing advice.","inputSchema":{"type":"object","properties":{"campaignType":{"type":"string","enum":["SMART_CAMPAIGN","YOUTUBE"]},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"limit":{"type":"integer","minimum":1,"maximum":100},"query":{"type":"string","maxLength":120}},"required":["campaignType"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_campaign_readiness","title":"Get Campaign Readiness","description":"Use this when the user is planning a campaign and wants to know if the proposed inputs are ready before dynamoi_launch_campaign. This validates readiness and targeting without creating a campaign. Do not use this to create or mutate campaigns.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"budgetAmount":{"type":"number","exclusiveMinimum":0},"budgetType":{"type":"string","enum":["DAILY","TOTAL"]},"campaignType":{"type":"string","enum":["SMART_CAMPAIGN","YOUTUBE"]},"contentType":{"type":"string","enum":["TRACK","ALBUM","PLAYLIST","VIDEO"]},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"format":{"type":"string","enum":["json","summary"]},"locationTargets":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":8},"name":{"type":"string","minLength":1,"maxLength":120}},"required":["code","name"],"additionalProperties":false}},"mediaAssetIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"spotifyUrl":{"type":"string","minLength":1,"maxLength":500},"youtubeVideoId":{"type":"string","minLength":1,"maxLength":128}},"required":["artistId","campaignType"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_start_youtube_channel_link","title":"Start YouTube Channel Link","description":"Use this when the user is ready to link a YouTube channel to one Dynamoi artist from chat. This returns a Google OAuth URL bound to the signed-in user and artist. Google returns to a Dynamoi page that tells the user to come back to the AI assistant; after that, poll dynamoi_get_platform_status with the returned onboardingAttemptId and onboardingFlow=youtube until platforms.youtube.connected is true.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"userIntentSummary":{"type":"string","maxLength":500}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_start_meta_connection","title":"Start Meta Connection","description":"Use this when billing is active and the user is ready to connect Meta for Spotify Smart Campaigns from chat. This returns a signed Meta OAuth URL and may send the user through a Page/Instagram selection step before the chat-first return page. If billing is not active, it returns billing_required instead of an OAuth URL. If billing cannot be verified due to a transient snapshot/API issue, it returns billing_check_unavailable and should be retried shortly. After the user returns, poll dynamoi_get_platform_status with the returned onboardingAttemptId and onboardingFlow=meta until platforms.meta.status is oauth_complete, partnership_pending, or partnership_active.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"userIntentSummary":{"type":"string","maxLength":500}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_update_campaign","title":"Update Campaign","description":"Use this when the user explicitly wants to pause, resume, or update the budget/end date for an existing campaign. Set action to pause, resume, or update_budget. Do not use this for inspection-only questions; this changes live campaign workflow state or external campaign settings.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["pause","resume","update_budget"]},"budgetAmount":{"type":"number","exclusiveMinimum":0},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"expectedCurrentBudgetAmount":{"type":"number","exclusiveMinimum":0},"expectedCurrentEndDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"expectedCurrentStatus":{"type":"string","enum":["AWAITING_SMART_LINK","ACTIVE","ARCHIVED","CONTENT_VALIDATION","DEPLOYING","ENDED","FAILED","PAUSED","READY_FOR_REVIEW","SUBSCRIPTION_PAUSED"]},"userIntentSummary":{"type":"string","maxLength":500}},"required":["action","campaignId"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_media_assets","title":"List Media Assets","description":"Use this when the user wants to choose from uploaded images or videos that can be reused in a campaign launch. Do not use this when the user only wants campaign status or analytics. Use format=json when you need asset IDs for a follow-up launch. Request includeUrls only when the assistant must display or inspect public-safe asset URLs.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"includeUrls":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":50}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_launch_campaign","title":"Start Campaign Launch Workflow","description":"Use this when the user explicitly wants to create a new Smart Campaign or YouTube Campaign and start the launch workflow with provided details. Ads are not necessarily live until the returned delivery state is ACTIVE. For review or demo Smart Campaign launches that already specify the artist, content title, budget, countries, and reusable media assets, you may omit spotifyUrl and endDate because Dynamoi can infer reviewer-safe defaults. Do not invent placeholder spotifyUrl or endDate values for those review/demo launches; omit them and let Dynamoi infer them. After a successful launch, answer from the returned campaign details directly instead of chaining more tools unless the user explicitly asked for more. Do not use this for recommendations or previews; this creates a real campaign workflow or demo-safe simulated campaign.","inputSchema":{"type":"object","properties":{"adCopy":{"type":"string","maxLength":500},"appleMusicUrl":{"type":"string","minLength":1,"maxLength":500},"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"budgetAmount":{"type":"number","exclusiveMinimum":0},"budgetSplits":{"type":"object","propertyNames":{"type":"string","enum":["META","GOOGLE"]},"additionalProperties":{"type":"integer","minimum":0,"maximum":100},"required":["META","GOOGLE"]},"budgetType":{"type":"string","enum":["DAILY","TOTAL"]},"campaignType":{"type":"string","enum":["SMART_CAMPAIGN","YOUTUBE"]},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contentTitle":{"type":"string","minLength":1,"maxLength":160},"contentType":{"type":"string","enum":["TRACK","ALBUM","PLAYLIST","VIDEO"]},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"locationTargets":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":8},"name":{"type":"string","minLength":1,"maxLength":120}},"required":["code","name"],"additionalProperties":false}},"mediaAssetIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"spotifyUrl":{"type":"string","minLength":1,"maxLength":500},"useAiGeneratedCopy":{"type":"boolean"},"userIntentSummary":{"type":"string","maxLength":500},"youtubeVideoId":{"type":"string","minLength":1,"maxLength":128}},"required":["artistId","budgetAmount","budgetSplits","budgetType","campaignType","clientRequestId","contentTitle","contentType"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_create_smart_link_from_spotify","title":"Create Free Smart Link from Spotify","description":"Use this when the user wants to create one free Dynamoi Smart Link from a Spotify album or track URL/URI, or a single starter release from a Spotify artist URL. For full-catalog artist imports or artist hub requests, prefer dynamoi_create_smart_links_from_spotify_artist. Smart Links are free to create and manage. High-popularity or unverifiable artist links may stay unpublished in verification hold until Dynamoi can verify the client relationship. This does not create a paid ad campaign. Spotify playlist URLs are not supported today. If the Smart Link already exists, return the existing link instead of creating a duplicate; if customDescription is provided, update that Smart Link's public description. In the final answer, lead with the public URL and do not expose internal IDs unless asked.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"customDescription":{"type":"string","maxLength":500},"format":{"type":"string","enum":["json","summary"]},"spotifyUrl":{"type":"string","minLength":1,"maxLength":500},"userIntentSummary":{"type":"string","maxLength":500}},"required":["artistId","spotifyUrl"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_create_smart_links_from_spotify_artist","title":"Create Free Smart Links for Spotify Artist","description":"Use this when the user gives a Spotify artist URL and wants Dynamoi to create, import, or refresh free Smart Links for the artist catalog and return the artist hub. If the signed-in user has no Dynamoi artist yet, omit artistId so Dynamoi can create the first artist from the Spotify artist profile. This starts the background catalog import so the user does not need to open the dashboard. Smart Links are free to create and manage. High-popularity or unverifiable artist catalog links may stay unpublished in verification hold until Dynamoi can verify the client relationship. This does not create a paid ad campaign. In the final answer, lead with the artist hub URL and current public Smart Link URLs; do not expose internal IDs unless asked.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"spotifyArtistUrl":{"type":"string","minLength":1,"maxLength":500},"userIntentSummary":{"type":"string","maxLength":500}},"required":["spotifyArtistUrl"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_smart_links","title":"List Smart Links","description":"Use this when the user wants to list free Smart Links for one artist, including release title, public URL, publish state, claim state, render state, and theme. Do not use this for paid campaign lists; use dynamoi_list_campaigns for campaigns. In the final answer, show public URLs and avoid internal IDs unless asked. If empty for an artist with connected Spotify, suggest dynamoi_create_smart_links_from_spotify_artist for catalog import or dynamoi_create_smart_link_from_spotify for one release instead of stopping at 'no Smart Links yet'.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"limit":{"type":"integer","minimum":1,"maximum":50},"query":{"type":"string","maxLength":120},"claimStatus":{"type":"string","enum":["auto_approved","pending_ops_review","verification_deferred","approved_by_ops","rejected"]},"publishState":{"type":"string","enum":["published","unpublished"]},"renderState":{"type":"string","enum":["queued","rendering","rendered","failed"]}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_smart_link","title":"Get Smart Link","description":"Use this when the user wants full details for one free Smart Link, including release, Spotify URL, public play.dynamoi.com URL, current status, theme source, and next actions. Set includeAnalytics=true for visit/click analytics and includeArtistSettings=true for artist-level theme/pixel settings. In the final answer, lead with the public URL and do not expose internal IDs unless asked.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"dateRange":{"type":"object","properties":{"end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["end","start"],"additionalProperties":false},"format":{"type":"string","enum":["json","summary"]},"granularity":{"type":"string","enum":["TOTAL","DAILY"]},"includeAnalytics":{"type":"boolean"},"includeArtistSettings":{"type":"boolean"},"includeBreakdowns":{"type":"boolean"},"playLinkId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"spotifyUrl":{"type":"string","minLength":1,"maxLength":500}},"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_update_smart_link","title":"Update Smart Link","description":"Use this when the user wants to change one Smart Link's public description, publish/unpublish the public landing page, or update artist-level Smart Link theme/pixel settings. Set action to update_description, publish, unpublish, or update_artist_settings. This updates public landing-page behavior and may queue background rendering.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["update_description","update_artist_settings","publish","unpublish"]},"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"customDescription":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"expectedPublishState":{"type":"string","enum":["published","unpublished"]},"expectedUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"googleAdsConversionId":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}]},"metaPixelId":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}]},"playLinkId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"theme":{"type":"string","enum":["classic","brutalist","aurora","cinematic"]},"tiktokPixelId":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}]},"userIntentSummary":{"type":"string","maxLength":500}},"required":["action"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]}]},"jsonrpc":"2.0","id":2},"http_status":200,"headers":{"content-type":"text/event-stream","strict-transport-security":"max-age=63072000; includeSubDomains; preload"}}},"prompts_list":{"status":"ok","latency_ms":99.69,"details":{"url":"https://dynamoi.com/mcp","payload":{"result":{"prompts":[{"name":"dynamoi_find_smart_link_url","title":"Find Smart Link URL","description":"Find a user's free Smart Link URL and answer with public URLs, titles, and statuses.","arguments":[{"name":"artistId","required":false},{"name":"query","required":false}]},{"name":"dynamoi_explain_free_smart_links","title":"Explain Free Smart Links","description":"Explain Dynamoi free Smart Links and how they differ from paid managed advertising.","arguments":[]},{"name":"dynamoi_create_free_smart_link","title":"Create Free Smart Link","description":"Create free Smart Links from a Spotify artist, album, or track URL.","arguments":[{"name":"artistId","required":false},{"name":"spotifyUrl","required":false}]},{"name":"dynamoi_audit_campaigns","title":"Audit Campaigns","description":"Audit an artist's campaigns and summarize what is working and what to fix next.","arguments":[{"name":"artistId","required":false}]},{"name":"dynamoi_release_launch_plan","title":"Release Launch Plan","description":"Create a pragmatic release launch plan and propose a Dynamoi campaign setup.","arguments":[{"name":"artistId","required":false},{"name":"contentTitle","required":false},{"name":"contentType","required":false}]},{"name":"dynamoi_why_campaign_blocked","title":"Why Is My Campaign Blocked?","description":"Diagnose why a campaign is blocked/stuck and recommend the next fix.","arguments":[{"name":"campaignId","required":true}]}]},"jsonrpc":"2.0","id":3},"http_status":200,"headers":{"content-type":"text/event-stream","strict-transport-security":"max-age=63072000; includeSubDomains; preload"}}},"prompt_get":{"status":"auth_required","latency_ms":89.44,"details":{"url":"https://dynamoi.com/mcp","error":"Client error '401 Unauthorized' for url 'https://dynamoi.com/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401","http_status":401,"payload":{},"headers":{"strict-transport-security":"max-age=63072000; includeSubDomains; preload","www-authenticate":"Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""},"reason":"auth_required","prompt_name":"dynamoi_find_smart_link_url","prompt_arguments":[{"name":"artistId","required":false},{"name":"query","required":false}]}},"resources_list":{"status":"ok","latency_ms":158.29,"details":{"url":"https://dynamoi.com/mcp","payload":{"result":{"resources":[{"uri":"dynamoi://platform/pricing","name":"platform-pricing","description":"Dynamoi campaign setup guidance and campaign budget minimums.","mimeType":"application/json","title":"Pricing"},{"uri":"dynamoi://platform/content-types","name":"platform-content-types","mimeType":"application/json","title":"Content Types"},{"uri":"dynamoi://platform/country-targeting","name":"platform-country-targeting","description":"Explains Smart Campaign vs YouTube country-targeting catalogs.","mimeType":"application/json","title":"Country Targeting"},{"uri":"dynamoi://platform/supported-countries","name":"platform-supported-countries","description":"Legacy alias for country-targeting guidance. Use dynamoi://platform/country-targeting for the canonical resource.","mimeType":"application/json","title":"Supported Countries"},{"uri":"dynamoi://smart-links/free-plan","name":"smart-links-free-plan","description":"Canonical explanation of Dynamoi's free Smart Links plan and how it differs from paid managed advertising.","mimeType":"application/json","title":"Free Smart Links"},{"uri":"dynamoi://smart-links/capabilities","name":"smart-links-capabilities","mimeType":"application/json","title":"Smart Link Capabilities"},{"uri":"dynamoi://business/free-vs-paid","name":"business-free-vs-paid","description":"Clear boundary between free Dynamoi Smart Links and paid managed advertising.","mimeType":"application/json","title":"Free Smart Links vs Paid Campaigns"},{"uri":"dynamoi://smart-links/agent-guide","name":"smart-links-agent-guide","description":"How agents should answer Smart Link questions using Dynamoi MCP tools.","mimeType":"application/json","title":"Smart Link Agent Guide"},{"uri":"dynamoi://mcp/tool-answering-rules","name":"mcp-tool-answering-rules","description":"General answer rules for Dynamoi MCP tools so agents stop after useful results.","mimeType":"application/json","title":"MCP Tool Answering Rules"},{"uri":"dynamoi://playbooks/spotify-artist","name":"playbook-spotify-artist","description":"Persona playbook: how to convert a Spotify artist user from auth-grant to first activated Smart Link.","mimeType":"application/json","title":"Playbook: Spotify Artist"},{"uri":"dynamoi://playbooks/youtube-creator","name":"playbook-youtube-creator","description":"Persona playbook: how to introduce a YouTube creator to Dynamoi's revenue-per-view optimization advantage.","mimeType":"application/json","title":"Playbook: YouTube Creator"},{"uri":"dynamoi://playbooks/label-or-manager","name":"playbook-label-or-manager","description":"Persona playbook: how to onboard a label, manager, or anyone running a roster of multiple artists.","mimeType":"application/json","title":"Playbook: Label or Manager"},{"uri":"dynamoi://playbooks/onboarding-tree","name":"playbook-onboarding-tree","description":"Decision tree for routing a brand-new MCP user to the right persona playbook based on their first reply.","mimeType":"application/json","title":"Playbook: Onboarding Decision Tree"},{"uri":"dynamoi://music-marketing/when-to-use-dynamoi","name":"music-marketing-when-to-use-dynamoi","description":"When an assistant should use Dynamoi account tools versus answering music marketing questions natively.","mimeType":"application/json","title":"When To Use Dynamoi"},{"uri":"dynamoi://platform/campaign-statuses","name":"platform-campaign-statuses","mimeType":"application/json","title":"Campaign Statuses"}]},"jsonrpc":"2.0","id":5},"http_status":200,"headers":{"content-type":"text/event-stream","strict-transport-security":"max-age=63072000; includeSubDomains; preload"}}},"resource_read":{"status":"auth_required","latency_ms":133.21,"details":{"url":"https://dynamoi.com/mcp","error":"Client error '401 Unauthorized' for url 'https://dynamoi.com/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401","http_status":401,"payload":{},"headers":{"strict-transport-security":"max-age=63072000; includeSubDomains; preload","www-authenticate":"Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""},"reason":"auth_required","resource_uri":"dynamoi://platform/pricing"}},"probe_noise_resilience":{"status":"ok","latency_ms":33.58,"details":{"url":"https://dynamoi.com/robots.txt","http_status":200,"headers":{"content-type":"text/plain"}}},"determinism_probe":{"status":"ok","latency_ms":167.13,"details":{"attempts":2,"successful":2,"matches":2,"stable_ratio":1.0,"baseline_signature":"847ffc4683249e0a8416f17711b95eb75d049b539fafa5d309cc70378b52d0aa","errors":[]}},"session_resume_probe":{"status":"warning","latency_ms":null,"details":{"reason":"no_session_id","transport":"streamable-http","resume_expected":true,"protocol_version":"2025-03-26"}},"step_up_auth_probe":{"status":"warning","latency_ms":null,"details":{"oauth_present":true,"auth_required_checks":["prompt_get","resource_read"],"supported_scopes":["email","openid","phone","profile"],"scope_specificity_ratio":0.2,"broad_scopes":[],"challenge_headers":["Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\"","Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""],"step_up_signals":["Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\"","Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""],"minimal_scope_documented":false}},"transport_compliance_probe":{"status":"warning","latency_ms":86.91,"details":{"transport":"streamable-http","session_id_present":false,"protocol_header_present":false,"last_event_id_visible":false,"requested_protocol_version":"2025-03-26","bad_protocol_status_code":400,"bad_protocol_payload":{"jsonrpc":"2.0","error":{"code":-32000,"message":"Bad Request: Unsupported protocol version: 1999-99-99 (supported versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07)"},"id":null},"bad_protocol_headers":{"content-type":"application/json","strict-transport-security":"max-age=63072000; includeSubDomains; preload"},"bad_protocol_error":null,"delete_status_code":null,"delete_error":null,"expired_session_status_code":null,"expired_session_error":null,"issues":["missing_session_id","missing_protocol_header"]}},"utility_coverage_probe":{"status":"ok","latency_ms":51.1,"details":{"completions":{"advertised":false,"sample_target":{"type":"prompt","name":"dynamoi_find_smart_link_url","argument_name":"artistId"},"live_probe":"not_executed"},"pagination":{"supported":false,"next_cursor_methods":[],"metadata_signal":false},"tasks":{"advertised":false,"probe_status":"auth_required","http_status":401},"initialize_capability_keys":["prompts","resources","tools"]}},"advanced_capabilities_probe":{"status":"ok","latency_ms":null,"details":{"capabilities":{"prompts":true,"resources":true,"completions":false,"roots":false,"sampling":false,"elicitation":false,"structured_outputs":true,"resource_links":true},"enabled_count":4,"enabled":["prompts","resource_links","resources","structured_outputs"],"initialize_capability_keys":["prompts","resources","tools"]}},"tool_snapshot_probe":{"status":"ok","latency_ms":null,"details":{"current_tool_count":22,"previous_tool_count":22,"similarity":1.0,"added":[],"removed":[],"changed_outputs":[]}},"connector_replay_probe":{"status":"ok","latency_ms":null,"details":{"backward_compatible":true,"would_break_after_refresh":false,"added_tools":[],"removed_tools":[],"required_arg_breaks":[],"output_breaks":[],"additive_output_changes":[]}},"request_association_probe":{"status":"missing","latency_ms":null,"details":{"reason":"no_request_association_capabilities_advertised"}},"interactive_flow_probe":{"status":"ok","latency_ms":null,"details":{"risk_hits":[],"safe_hits":["oauth","browser"],"oauth_supported":true,"prompt_available":false}},"action_safety_probe":{"status":"warning","latency_ms":null,"details":{"summary":{"tool_count":22,"high_risk_tools":11,"destructive_tools":0,"exec_tools":4,"egress_tools":7,"secret_tools":3,"bulk_access_tools":17,"risk_distribution":{"low":1,"medium":10,"high":11,"critical":0},"capability_distribution":{"read":20,"admin":20,"export":17,"filesystem":3,"write":14,"exec":4,"secrets":3,"network":13}},"auth_present":true,"safeguard_count":2,"confirmation_signals":["dynamoi_get_account_overview","dynamoi_get_billing","dynamoi_launch_campaign"]}},"official_registry_probe":{"status":"ok","latency_ms":null,"details":{"registry_source":"official_registry","registry_identifier":"io.github.getDynamoi/dynamoi","direct_match":true,"official_peer_count":1}},"provenance_divergence_probe":{"status":"ok","latency_ms":null,"details":{"direct_official_match":true,"registry_title":null,"server_card_title":"Dynamoi","registry_version":null,"server_card_version":"0.6.4","registry_homepage":null,"server_card_homepage":null,"registry_repository":null,"server_card_repository":"https://github.com/getDynamoi/mcp","drift_fields":[],"metadata_document_count":3}},"connector_publishability_probe":{"status":"ok","latency_ms":null,"details":{"transport":"streamable-http","tool_count":22,"high_risk_tools":11,"blockers":[],"criteria":{"remote_transport":true,"initialize":true,"tools_list":true,"protocol_version":true,"session_resume":true,"step_up_auth":true,"transport_compliance":true,"connector_replay":true,"request_association":true,"action_safety":true,"server_card":true,"tool_surface":true,"auth_flow":true}}}},"failures":{"prompt_get":{"url":"https://dynamoi.com/mcp","error":"Client error '401 Unauthorized' for url 'https://dynamoi.com/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401","http_status":401,"payload":{},"headers":{"strict-transport-security":"max-age=63072000; includeSubDomains; preload","www-authenticate":"Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""},"reason":"auth_required","prompt_name":"dynamoi_find_smart_link_url","prompt_arguments":[{"name":"artistId","required":false},{"name":"query","required":false}]}}},"active_alerts":[{"code":"validation_stale","severity":"medium","title":"Validation evidence is outside TrustOps SLA","message":"Latest validation is 393.6 hours old, beyond the configured 24h TrustOps alert threshold."}],"maintainer_analytics":{"validation_run_count":20,"average_latency_ms":1991.34,"healthy_run_ratio_recent":1.0,"registry_presence_count":3,"active_alert_count":1,"watcher_count":0,"verified_claim":false,"taxonomy_tags":["development","search","communication","web"],"score_trend":[79.72,78.7,79.72,79.72,79.72,79.72,79.72,79.72,79.72,79.21],"remediation_count":7,"high_risk_tool_count":11,"destructive_tool_count":0,"exec_tool_count":4},"public_server_reputation":{"validation_success_ratio_7d":null,"validation_success_ratio_30d":1.0,"mean_time_to_recover_hours":null,"breaking_diffs_30d":1,"registry_drift_frequency_30d":0,"snapshot_change_frequency_30d":1},"maintainer_response_quality":{"score":16.67,"signals":{"verified_maintainer_claim":false,"support_contact_present":false,"changelog_present":false,"incident_notes_present":false,"tool_change_documented":true,"annotation_history_present":false},"annotation_count":0,"latest_annotation_at":null},"maintainer_annotations":[],"maintainer_rebuttals":[],"security_posture_summary":{"tool_count":22,"high_risk_tools":11,"destructive_tools":0,"exec_tools":4,"egress_tools":7,"secret_tools":3,"bulk_access_tools":17,"risk_distribution":{"low":1,"medium":10,"high":11,"critical":0},"capability_distribution":{"read":20,"admin":20,"export":17,"filesystem":3,"write":14,"exec":4,"secrets":3,"network":13}},"tool_security_inventory":[{"name":"dynamoi_get_account_overview","description":"Use this when the user explicitly asks about the signed-in Dynamoi account itself, such as who is logged in, how many organizations or artists it can access, or whether account-level platform connections exist. Always pass intent to match that explicit account question. Do not use this to confirm a specific Meta or YouTube onboarding attempt because this account-level state can span multiple artists; use dynamoi_get_platform_status for the target artist instead. Do not use this to enumerate artists one by one; use dynamoi_list_artists for that. Never use this to 'check context' before answering generic Instagram, lyrics, songwriting, or marketing-advice questions, even if Dynamoi is attached.","capabilities":["read","admin","export"],"risk_flags":["bulk_data_access"],"risk_level":"medium","has_safeguards":true,"capability_taxonomy":["read","admin","export","development","monitoring"]},{"name":"dynamoi_list_artists","description":"Use this when the user wants to see which artists or YouTube channels they manage, along with billing status, active campaign count, and their role. Pass artistId when you need the full profile/readiness details for one artist instead of a roster page. Do not use this for campaign details; use dynamoi_list_campaigns or dynamoi_get_campaign. Never use this for generic social-media or marketing advice, including Instagram follower-growth questions, unless the user explicitly asked about their Dynamoi roster. If the result is empty, the user is brand-new — do not stop with 'no records found'; route through dynamoi_get_account_overview.recommendedNextActions.","capabilities":["read","filesystem","admin","export"],"risk_flags":["bulk_data_access"],"risk_level":"medium","has_safeguards":false,"capability_taxonomy":["read","filesystem","admin","export","development","web","finance","files"]},{"name":"dynamoi_search","description":"Use this when the user mentions an artist, release, campaign, or smart link but you do not yet know the exact record to inspect. Do not use this for analytics summaries or billing questions once you already know the target record. If the result is empty for a brand-new user (no artists yet), do not respond 'no records found' as a terminal answer — instead suggest creating their first artist hub via dynamoi_create_smart_links_from_spotify_artist.","capabilities":["read","write","exec","admin","export"],"risk_flags":["command_execution","bulk_data_access","admin_mutation"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","write","exec","admin","export","search","finance"]},{"name":"search","description":"OpenAI ChatGPT Deep Research / Connectors search contract. Returns matching Dynamoi artists, campaigns, and Smart Links so they can be cited in a deep-research session. For regular ChatGPT chat use dynamoi_search instead.","capabilities":["read","exec","secrets"],"risk_flags":["command_execution","secret_material_access"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","exec","secrets","development","search","communication"]},{"name":"fetch","description":"OpenAI ChatGPT Deep Research / Connectors fetch contract. Given an id returned by `search` (formatted as 'artist:<uuid>', 'campaign:<uuid>', or 'smartlink:<uuid>'), returns the full record for citation.","capabilities":["read"],"risk_flags":[],"risk_level":"low","has_safeguards":false,"capability_taxonomy":["read","development","search","communication"]},{"name":"dynamoi_list_campaigns","description":"Use this when the user wants to browse campaigns for one artist, optionally filtered by type or status. Do not use this for a single campaign deep dive; use dynamoi_get_campaign for that. Never use this to personalize generic marketing advice. If the user has no artists yet, do not call this — route via dynamoi_get_account_overview first.","capabilities":["read","admin","export"],"risk_flags":["bulk_data_access"],"risk_level":"medium","has_safeguards":false,"capability_taxonomy":["read","admin","export"]},{"name":"dynamoi_get_campaign","description":"Use this when the user wants full details for one campaign, including budget, targeting, platform status, and next actions. Set includeAnalytics=true for one-campaign performance, includeDeploymentStatus=true for delivery/deployment blockers, and includeCountries=true only when the full country list is needed. Do not use this for a campaign list; use dynamoi_list_campaigns instead. After a successful launch or campaign mutation, prefer format=summary when you need a follow-up read to relay the final answer.","capabilities":["read","write","admin","export"],"risk_flags":["bulk_data_access","admin_mutation"],"risk_level":"medium","has_safeguards":false,"capability_taxonomy":["read","write","admin","export","cloud"]},{"name":"dynamoi_get_artist_analytics","description":"Use this when the user wants artist-level performance across all campaigns, including 30-day rollups or daily breakdowns. Pass granularity=DAILY when the user asks for a daily breakdown. Pass format=summary when the user wants a written rollup, a strongest-campaign verdict, or a direct answer you can relay immediately. If this tool already returned the requested strongest-campaign comparison, stop and answer instead of calling more analytics tools. For one campaign's metrics, use dynamoi_get_campaign with includeAnalytics=true.","capabilities":["read","network","admin","export"],"risk_flags":["bulk_data_access"],"risk_level":"medium","has_safeguards":false,"capability_taxonomy":["read","network","admin","export","monitoring"]},{"name":"dynamoi_get_billing","description":"Use this when the user asks about billing state, credit balance, promo limits, subscription status, or whether billing blocks launches for one artist. This is a read-only status check; it does not create checkout links or collect payment. If billing blocks a launch, direct the user to start or restore managed advertising in the Dynamoi dashboard, then call this tool again to confirm the status. Do not use this for campaign analytics or platform connection troubleshooting.","capabilities":["read","write","admin","export"],"risk_flags":["bulk_data_access","admin_mutation"],"risk_level":"medium","has_safeguards":true,"capability_taxonomy":["read","write","admin","export","finance"]},{"name":"dynamoi_get_platform_status","description":"Use this when the user wants to know whether Spotify, Meta, or YouTube are connected and what setup steps still block launches. When polling after a connection-start flow, pass the returned onboardingAttemptId and onboardingFlow so Dynamoi ops can correlate the browser step. Do not use this for detailed billing questions. Never use this to personalize generic Instagram or marketing-advice questions.","capabilities":["read","write","network","admin","export"],"risk_flags":["bulk_data_access","admin_mutation"],"risk_level":"medium","has_safeguards":false,"capability_taxonomy":["read","write","network","admin","export","web","finance"]},{"name":"dynamoi_list_available_countries","description":"Use this when the user asks which countries they can target for a Smart Campaign or YouTube campaign. Always pass campaignType because Smart Campaign and YouTube country catalogs are different. Do not use this for generic country marketing advice.","capabilities":["read","exec","admin","export"],"risk_flags":["command_execution","bulk_data_access"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","exec","admin","export","monitoring"]},{"name":"dynamoi_get_campaign_readiness","description":"Use this when the user is planning a campaign and wants to know if the proposed inputs are ready before dynamoi_launch_campaign. This validates readiness and targeting without creating a campaign. Do not use this to create or mutate campaigns.","capabilities":["read","write","network","admin","export"],"risk_flags":["arbitrary_network_egress","bulk_data_access","admin_mutation"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","write","network","admin","export"]},{"name":"dynamoi_start_youtube_channel_link","description":"Use this when the user is ready to link a YouTube channel to one Dynamoi artist from chat. This returns a Google OAuth URL bound to the signed-in user and artist. Google returns to a Dynamoi page that tells the user to come back to the AI assistant; after that, poll dynamoi_get_platform_status with the returned onboardingAttemptId and onboardingFlow=youtube until platforms.youtube.connected is true.","capabilities":["read","network","admin","secrets","export"],"risk_flags":["bulk_data_access","secret_material_access"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","network","admin","secrets","export","communication","web","security"]},{"name":"dynamoi_start_meta_connection","description":"Use this when billing is active and the user is ready to connect Meta for Spotify Smart Campaigns from chat. This returns a signed Meta OAuth URL and may send the user through a Page/Instagram selection step before the chat-first return page. If billing is not active, it returns billing_required instead of an OAuth URL. If billing cannot be verified due to a transient snapshot/API issue, it returns billing_check_unavailable and should be retried shortly. After the user returns, poll dynamoi_get_platform_status with the returned onboardingAttemptId and onboardingFlow=meta until platforms.meta.status is oauth_complete, partnership_pending, or partnership_active.","capabilities":["read","write","network","admin","secrets","export"],"risk_flags":["bulk_data_access","secret_material_access","admin_mutation"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","write","network","admin","secrets","export","communication","web","security","finance"]},{"name":"dynamoi_update_campaign","description":"Use this when the user explicitly wants to pause, resume, or update the budget/end date for an existing campaign. Set action to pause, resume, or update_budget. Do not use this for inspection-only questions; this changes live campaign workflow state or external campaign settings.","capabilities":["read","write","network","admin"],"risk_flags":["admin_mutation"],"risk_level":"medium","has_safeguards":false,"capability_taxonomy":["read","write","network","admin","development","automation"]},{"name":"dynamoi_list_media_assets","description":"Use this when the user wants to choose from uploaded images or videos that can be reused in a campaign launch. Do not use this when the user only wants campaign status or analytics. Use format=json when you need asset IDs for a follow-up launch. Request includeUrls only when the assistant must display or inspect public-safe asset URLs.","capabilities":["read","write","network","filesystem","admin","export"],"risk_flags":["arbitrary_network_egress","bulk_data_access","filesystem_mutation","admin_mutation"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","write","network","filesystem","admin","export"]},{"name":"dynamoi_launch_campaign","description":"Use this when the user explicitly wants to create a new Smart Campaign or YouTube Campaign and start the launch workflow with provided details. Ads are not necessarily live until the returned delivery state is ACTIVE. For review or demo Smart Campaign launches that already specify the artist, content title, budget, countries, and reusable media assets, you may omit spotifyUrl and endDate because Dynamoi can infer reviewer-safe defaults. Do not invent placeholder spotifyUrl or endDate values for those review/demo launches; omit them and let Dynamoi infer them. After a successful launch, answer from the returned campaign details directly instead of chaining more tools unless the user explicitly asked for more. Do not use this for recommendations or previews; this creates a real campaign workflow or demo-safe simulated campaign.","capabilities":["read","write","network","admin"],"risk_flags":["arbitrary_network_egress","admin_mutation"],"risk_level":"medium","has_safeguards":false,"capability_taxonomy":["read","write","network","admin","development","automation"]},{"name":"dynamoi_create_smart_link_from_spotify","description":"Use this when the user wants to create one free Dynamoi Smart Link from a Spotify album or track URL/URI, or a single starter release from a Spotify artist URL. For full-catalog artist imports or artist hub requests, prefer dynamoi_create_smart_links_from_spotify_artist. Smart Links are free to create and manage. High-popularity or unverifiable artist links may stay unpublished in verification hold until Dynamoi can verify the client relationship. This does not create a paid ad campaign. Spotify playlist URLs are not supported today. If the Smart Link already exists, return the existing link instead of creating a duplicate; if customDescription is provided, update that Smart Link's public description. In the final answer, lead with the public URL and do not expose internal IDs unless asked.","capabilities":["read","write","network","admin","export"],"risk_flags":["arbitrary_network_egress","bulk_data_access","admin_mutation"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","write","network","admin","export","monitoring"]},{"name":"dynamoi_create_smart_links_from_spotify_artist","description":"Use this when the user gives a Spotify artist URL and wants Dynamoi to create, import, or refresh free Smart Links for the artist catalog and return the artist hub. If the signed-in user has no Dynamoi artist yet, omit artistId so Dynamoi can create the first artist from the Spotify artist profile. This starts the background catalog import so the user does not need to open the dashboard. Smart Links are free to create and manage. High-popularity or unverifiable artist catalog links may stay unpublished in verification hold until Dynamoi can verify the client relationship. This does not create a paid ad campaign. In the final answer, lead with the artist hub URL and current public Smart Link URLs; do not expose internal IDs unless asked.","capabilities":["write","network","filesystem","admin","export"],"risk_flags":["arbitrary_network_egress","bulk_data_access","filesystem_mutation","admin_mutation"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["write","network","filesystem","admin","export","files","monitoring"]},{"name":"dynamoi_list_smart_links","description":"Use this when the user wants to list free Smart Links for one artist, including release title, public URL, publish state, claim state, render state, and theme. Do not use this for paid campaign lists; use dynamoi_list_campaigns for campaigns. In the final answer, show public URLs and avoid internal IDs unless asked. If empty for an artist with connected Spotify, suggest dynamoi_create_smart_links_from_spotify_artist for catalog import or dynamoi_create_smart_link_from_spotify for one release instead of stopping at 'no Smart Links yet'.","capabilities":["read","write","exec","network","admin","export"],"risk_flags":["command_execution","bulk_data_access","admin_mutation"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","write","exec","network","admin","export","healthcare","monitoring"]},{"name":"dynamoi_get_smart_link","description":"Use this when the user wants full details for one free Smart Link, including release, Spotify URL, public play.dynamoi.com URL, current status, theme source, and next actions. Set includeAnalytics=true for visit/click analytics and includeArtistSettings=true for artist-level theme/pixel settings. In the final answer, lead with the public URL and do not expose internal IDs unless asked.","capabilities":["read","write","network","admin","export"],"risk_flags":["arbitrary_network_egress","bulk_data_access","admin_mutation"],"risk_level":"high","has_safeguards":false,"capability_taxonomy":["read","write","network","admin","export"]},{"name":"dynamoi_update_smart_link","description":"Use this when the user wants to change one Smart Link's public description, publish/unpublish the public landing page, or update artist-level Smart Link theme/pixel settings. Set action to update_description, publish, unpublish, or update_artist_settings. This updates public landing-page behavior and may queue background rendering.","capabilities":["write","network","admin"],"risk_flags":["arbitrary_network_egress","admin_mutation"],"risk_level":"medium","has_safeguards":false,"capability_taxonomy":["write","network","admin","web"]}],"transport_compliance":{"status":"warning","transport":"streamable-http","session_id_present":false,"protocol_header_present":false,"last_event_id_visible":false,"bad_protocol_status_code":400,"delete_status_code":null,"expired_session_status_code":null,"issues":["missing_session_id","missing_protocol_header"]},"utility_coverage":{"status":"ok","completions":{"advertised":false,"sample_target":{"type":"prompt","name":"dynamoi_find_smart_link_url","argument_name":"artistId"},"live_probe":"not_executed"},"pagination":{"supported":false,"next_cursor_methods":[],"metadata_signal":false},"tasks":{"advertised":false,"probe_status":"auth_required","http_status":401},"initialize_capability_keys":["prompts","resources","tools"]},"write_action_governance":{"status":"warning","safe_to_publish":true,"auth_boundary":"oauth_or_auth_required","blast_radius":"high","summary":{"tool_count":22,"high_risk_tools":11,"destructive_tools":0,"exec_tools":4,"egress_tools":7,"secret_tools":3,"bulk_access_tools":17,"risk_distribution":{"low":1,"medium":10,"high":11,"critical":0},"capability_distribution":{"read":20,"admin":20,"export":17,"filesystem":3,"write":14,"exec":4,"secrets":3,"network":13}},"high_risk_tools":[{"name":"dynamoi_search","risk_level":"high","risk_flags":["command_execution","bulk_data_access","admin_mutation"],"has_safeguards":false},{"name":"search","risk_level":"high","risk_flags":["command_execution","secret_material_access"],"has_safeguards":false},{"name":"dynamoi_list_available_countries","risk_level":"high","risk_flags":["command_execution","bulk_data_access"],"has_safeguards":false},{"name":"dynamoi_get_campaign_readiness","risk_level":"high","risk_flags":["arbitrary_network_egress","bulk_data_access","admin_mutation"],"has_safeguards":false},{"name":"dynamoi_start_youtube_channel_link","risk_level":"high","risk_flags":["bulk_data_access","secret_material_access"],"has_safeguards":false},{"name":"dynamoi_start_meta_connection","risk_level":"high","risk_flags":["bulk_data_access","secret_material_access","admin_mutation"],"has_safeguards":false},{"name":"dynamoi_list_media_assets","risk_level":"high","risk_flags":["arbitrary_network_egress","bulk_data_access","filesystem_mutation","admin_mutation"],"has_safeguards":false},{"name":"dynamoi_create_smart_link_from_spotify","risk_level":"high","risk_flags":["arbitrary_network_egress","bulk_data_access","admin_mutation"],"has_safeguards":false},{"name":"dynamoi_create_smart_links_from_spotify_artist","risk_level":"high","risk_flags":["arbitrary_network_egress","bulk_data_access","filesystem_mutation","admin_mutation"],"has_safeguards":false},{"name":"dynamoi_list_smart_links","risk_level":"high","risk_flags":["command_execution","bulk_data_access","admin_mutation"],"has_safeguards":false},{"name":"dynamoi_get_smart_link","risk_level":"high","risk_flags":["arbitrary_network_egress","bulk_data_access","admin_mutation"],"has_safeguards":false}],"confirmation_signals":["dynamoi_get_account_overview","dynamoi_get_billing","dynamoi_launch_campaign"],"safeguard_count":2},"provenance_divergence":{"status":"ok","direct_official_match":true,"drift_fields":[],"registry_title":null,"server_card_title":"Dynamoi","registry_version":null,"server_card_version":"0.6.4","registry_homepage":null,"server_card_homepage":null},"alias_consolidation":{"canonical_identifier":"io.github.getDynamoi/dynamoi","duplicate_count":2,"registry_sources":["github_topic_registry","official_registry","smithery_registry"],"registry_identifiers":["github_topic_registry:getDynamoi/mcp","io.github.getDynamoi/dynamoi","smithery_registry:1e392146-8333-4dd1-893d-39041f3ca2e0"],"remote_urls":["https://dynamoi.com/mcp"],"homepages":["https://dynamoi.com"],"source_disagreements":["registry_source","registry_identifier"],"source_disagreement_details":{"registry_source":{"label":"Registry source","explanation":"Multiple registries or registry sync paths claim this same canonical server.","values":["github_topic_registry","official_registry","smithery_registry"]},"registry_identifier":{"label":"Registry identifier","explanation":"Different registry-specific identifiers resolve to the same canonical server record here.","values":["github_topic_registry:getDynamoi/mcp","io.github.getDynamoi/dynamoi","smithery_registry:1e392146-8333-4dd1-893d-39041f3ca2e0"]}}},"alert_routing":{"active_watch_count":0,"route_counts":{"generic_webhook":0,"slack":0,"teams":0,"email":0},"destinations":[]},"authenticated_validation":{"latest_profile":"remote_mcp","authenticated_session_used":false,"public_score_remains_anonymous":true,"preview_endpoint":"/v1/verify","ci_preview_endpoint":"/v1/ci/preview"},"hosted_runtime":{"schema_version":"verify.hosted_runtime.v1","server":"io.github.getDynamoi/dynamoi","tier":"community","readiness":{"allowed_to_activate":false,"blockers":["validation_freshness_sla_breached"],"score":79.72,"min_score":70.0,"freshness_hours":393.5718650883333,"max_freshness_hours":168.0,"latest_validation_run_id":"5b3b8a6f-192d-42be-b604-aa0d8d8dff7c"},"active_deployment_id":null,"active_endpoint_url":null,"deployments":[]},"action_controls_diff":{"snapshot_changed":false,"new_actions":[],"changed_actions":[],"disabled_by_default_candidates":[],"manual_review_candidates":[]},"benchmark_tasks":[{"key":"discover_tools","label":"Discover tools","status":"passes","evidence":[{"check":"initialize","status":"ok","source":"live_validation","note":null,"http_status":200},{"check":"tools_list","status":"ok","source":"live_validation","note":null,"http_status":200}]},{"key":"read_only_fetch_flow","label":"Read-only fetch flow","status":"degraded","evidence":[{"check":"resource_read","status":"auth_required","source":"live_validation","note":"resources/read is a strong read-path signal","http_status":401},{"check":"read_only_tool_surface","status":"ok","source":"derived_tool_inventory","note":"Low-risk read tools were inferred from the current tool surface.","http_status":null}]},{"key":"oauth_required_connect","label":"OAuth-required connect","status":"passes","evidence":[{"check":"oauth_protected_resource","status":"ok","source":"live_validation","note":null,"http_status":200},{"check":"step_up_auth_probe","status":"warning","source":"live_validation","note":null,"http_status":null}]},{"key":"safe_write_flow_with_confirmation","label":"Safe write flow with confirmation","status":"degraded","evidence":[{"check":"action_safety_probe","status":"warning","source":"live_validation","note":null,"http_status":null}]}],"latest_capability_counts":{"tool_count":22,"prompt_count":6,"resource_count":15},"point_loss_breakdown":[{"key":"utility_coverage_score","label":"Utility Coverage","score":2.0,"max_score":4.0,"gap":2.0},{"key":"transport_compliance_score","label":"Transport Compliance","score":2.0,"max_score":4.0,"gap":2.0},{"key":"spec_recency_score","label":"Spec Recency","score":2.0,"max_score":4.0,"gap":2.0},{"key":"secret_handling_hygiene_score","label":"Secret Handling Hygiene","score":2.0,"max_score":4.0,"gap":2.0},{"key":"registry_consistency_score","label":"Registry Consistency","score":2.0,"max_score":4.0,"gap":2.0},{"key":"rate_limit_semantics_score","label":"Rate Limit Semantics","score":2.0,"max_score":4.0,"gap":2.0},{"key":"egress_ssrf_resilience_score","label":"Egress SSRF Resilience","score":2.0,"max_score":4.0,"gap":2.0},{"key":"discovery_metadata_score","label":"Discovery Metadata","score":2.0,"max_score":4.0,"gap":2.0},{"key":"dependency_supply_chain_signal_score","label":"Dependency Supply Chain Signal","score":2.0,"max_score":4.0,"gap":2.0},{"key":"data_exfiltration_resilience_score","label":"Data Exfiltration Resilience","score":2.0,"max_score":4.0,"gap":2.0},{"key":"action_safety_score","label":"Action Safety","score":2.0,"max_score":4.0,"gap":2.0},{"key":"recovery_semantics_score","label":"Recovery Semantics","score":2.5,"max_score":4.0,"gap":1.5}],"verdict_traces":{"production_readiness":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first.","confidence":{"score":65.0,"label":"medium"},"triggering_alerts":[{"code":"validation_stale","severity":"medium","title":"Validation evidence is outside TrustOps SLA"}],"winning_source":"live_validation"},"client_readiness":[{"key":"openai_connectors","status":"ready","reason":"No major blockers detected.","triggering_checks":["initialize","tools_list","transport_compliance_probe","step_up_auth_probe","connector_replay_probe","request_association_probe"],"confidence":{"score":65.0,"label":"medium"},"winning_source":"live_validation","conflicting_sources":[]},{"key":"claude_desktop","status":"ready","reason":"No major blockers detected.","triggering_checks":["initialize","tools_list","transport_compliance_probe"],"confidence":{"score":65.0,"label":"medium"},"winning_source":"live_validation","conflicting_sources":[]},{"key":"unsafe_for_write_actions","status":"no","reason":"Current write surface is bounded enough for cautious review with production policy controls.","triggering_checks":["action_safety_probe"],"confidence":{"score":65.0,"label":"medium"},"winning_source":"live_validation","conflicting_sources":[]},{"key":"snapshot_churn_risk","status":"low","reason":"No material tool-surface churn detected in the latest comparison.","triggering_checks":["tool_snapshot_probe","connector_replay_probe"],"confidence":{"score":65.0,"label":"medium"},"winning_source":"history","conflicting_sources":[]}]},"current_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_73b802bc52eceaf3","generated_at":"2026-06-18T11:55:38.707039+00:00","source":"current_snapshot","server":"io.github.getDynamoi/dynamoi","last_validated_at":"2026-06-02T02:21:19.679672+00:00","validation_age_hours":393.57,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-06-02T02:21:19.679672+00:00","age_hours":393.57,"bucket":"verified_last_30d","label":"Verified in last 30d","badges":["verified_last_30d"],"freshness_sla_hours":168.0,"freshness_sla_status":"breached","stale_score_suppressed":false,"display_score":79.72,"raw_score":79.72,"confidence_score":65.0,"confidence_weighted_score":36.3,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":false,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":false,"priority_revalidation":true}]},"current_status":"healthy","current_score":79.72,"display_score":79.72,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Block for production","why":"stale validation evidence + exec-capable tools + no confirmation safeguards + high-risk tools need review","next_action":"revalidate, add safeguards, export policy","reason_count":4},"production_readiness_class":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first."},"evidence_confidence":{"score":65.0,"label":"medium","validation_age_hours":393.57,"live_check_count":26},"active_alerts":[{"code":"validation_stale","severity":"medium","title":"Validation evidence is outside TrustOps SLA"}]},"trust_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_73b802bc52eceaf3","generated_at":"2026-06-18T11:55:38.707039+00:00","source":"current_snapshot","server":"io.github.getDynamoi/dynamoi","last_validated_at":"2026-06-02T02:21:19.679672+00:00","validation_age_hours":393.57,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-06-02T02:21:19.679672+00:00","age_hours":393.57,"bucket":"verified_last_30d","label":"Verified in last 30d","badges":["verified_last_30d"],"freshness_sla_hours":168.0,"freshness_sla_status":"breached","stale_score_suppressed":false,"display_score":79.72,"raw_score":79.72,"confidence_score":65.0,"confidence_weighted_score":36.3,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":false,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":false,"priority_revalidation":true}]},"current_status":"healthy","current_score":79.72,"display_score":79.72,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Block for production","why":"stale validation evidence + exec-capable tools + no confirmation safeguards + high-risk tools need review","next_action":"revalidate, add safeguards, export policy","reason_count":4},"production_readiness_class":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first."},"evidence_confidence":{"score":65.0,"label":"medium","validation_age_hours":393.57,"live_check_count":26},"active_alerts":[{"code":"validation_stale","severity":"medium","title":"Validation evidence is outside TrustOps SLA"}]},"agent_commerce":{"status":"beta","commerce_signal":"strong","payment_execution_detected":"yes","billing_or_usage_detected":"yes","quote_or_pricing_detected":"no","numeric_price_context":"yes","commercial_quote_context":"no","checkout_or_charge_detected":"yes","checkout_term_observed":"yes","payment_capable":"observed","payment_rails":[],"purchase_stage_supported":["usage_metering","checkout_redirect","payment_initiation"],"human_confirmation_required":"yes","spending_policy_supported":"yes","receipt_supported":"unknown","refund_policy_present":"unknown","operator_identity":"declared","auth_required":"yes","auth_scheme":"oauth","tool_risk_level":"financial_action","tool_risk_score":85,"pricing_transparency":"clear","schema_change_detected":"unknown","delegation_level":"policy_limited_autonomous_purchase","evidence_level":"observed","confidence":"high","highest_risk_tools":[{"name":"dynamoi_get_account_overview","risk_level":"administrative"},{"name":"dynamoi_list_artists","risk_level":"administrative"},{"name":"dynamoi_search","risk_level":"administrative"},{"name":"dynamoi_list_campaigns","risk_level":"administrative"},{"name":"dynamoi_get_campaign","risk_level":"administrative"},{"name":"dynamoi_get_artist_analytics","risk_level":"administrative"},{"name":"dynamoi_get_billing","risk_level":"financial_action"},{"name":"dynamoi_get_platform_status","risk_level":"administrative"},{"name":"dynamoi_list_available_countries","risk_level":"administrative"},{"name":"dynamoi_get_campaign_readiness","risk_level":"administrative"}],"skipped_unsafe_tools":["dynamoi_get_account_overview","dynamoi_list_artists","dynamoi_search","dynamoi_list_campaigns","dynamoi_get_campaign","dynamoi_get_artist_analytics","dynamoi_get_billing","dynamoi_get_platform_status","dynamoi_list_available_countries","dynamoi_get_campaign_readiness","dynamoi_start_youtube_channel_link","dynamoi_start_meta_connection","dynamoi_update_campaign","dynamoi_list_media_assets","dynamoi_launch_campaign","dynamoi_create_smart_link_from_spotify","dynamoi_create_smart_links_from_spotify_artist","dynamoi_list_smart_links","dynamoi_get_smart_link","dynamoi_update_smart_link"],"last_checked_at":"2026-06-18T11:55:38.686540+00:00","evidence":[{"field":"commerce_signal","value":"strong","evidence_level":"observed","source":"tool_schema","matched_terms":["checkout","payment","subscription","billing","credit","limit","limits","balance"],"sample":"dynamoi_list_artists","confidence":"high","last_checked_at":"2026-06-18T11:55:38.686540+00:00"}],"disclaimer":"Beta assessment. Verify detects evidence and risk signals but does not certify that this server is safe for autonomous purchases.","scores":{"auth_posture_score":90,"tool_risk_score":85,"payment_readiness_score":100,"agent_delegation_safety_score":85,"overall_agent_commerce_score":84},"warnings":[],"recommended_fixes":["Separate quote/cart tools from charge/settlement tools.","Require explicit user confirmation for payment execution.","Return amount, currency, merchant, and receipt identifiers.","Publish pricing and refund/cancellation policy.","Add operator identity metadata.","Add spending policy support or mandate constraints."]},"latest_claim":null,"maintainer_profile_slug":null,"watch_summary":{"count":0,"teams":[],"emails":[]}},"latest_validation":{"id":"5b3b8a6f-192d-42be-b604-aa0d8d8dff7c","validation_profile":"remote_mcp","status":"completed","summary_status":"healthy","transport_type":"streamable-http","latency_ms":2089.27,"failures":{"prompt_get":{"url":"https://dynamoi.com/mcp","error":"Client error '401 Unauthorized' for url 'https://dynamoi.com/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401","http_status":401,"payload":{},"headers":{"strict-transport-security":"max-age=63072000; includeSubDomains; preload","www-authenticate":"Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""},"reason":"auth_required","prompt_name":"dynamoi_find_smart_link_url","prompt_arguments":[{"name":"artistId","required":false},{"name":"query","required":false}]}},"checks":{"server_card":{"status":"ok","latency_ms":112.91,"details":{"url":"https://dynamoi.com/.well-known/mcp/server-card.json","payload":{"$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","description":"Create free Smart Links and artist hubs from Spotify, view link and campaign analytics, and manage Dynamoi music and YouTube campaigns.","name":"io.github.getDynamoi/dynamoi","packages":[{"identifier":"@dynamoi/mcp","registryType":"npm","transport":{"type":"streamable-http","url":"https://dynamoi.com/mcp"},"version":"0.6.4"}],"remotes":[{"type":"streamable-http","url":"https://dynamoi.com/mcp"}],"repository":{"source":"github","subfolder":"packages/mcp","url":"https://github.com/getDynamoi/mcp"},"title":"Dynamoi","version":"0.6.4","websiteUrl":"https://dynamoi.com"},"http_status":200,"headers":{"content-type":"application/json; charset=utf-8"}}},"oauth_protected_resource":{"status":"ok","latency_ms":18.64,"details":{"url":"https://dynamoi.com/.well-known/oauth-protected-resource","payload":{"authorization_servers":["https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1"],"bearer_methods_supported":["header"],"resource":"https://dynamoi.com/mcp","resource_documentation":"https://dynamoi.com/docs/mcp-server","scopes_supported":["email","profile"]},"http_status":200,"headers":{"content-type":"application/json; charset=utf-8"}}},"oauth_authorization_server":{"status":"ok","latency_ms":158.82,"details":{"url":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/.well-known/oauth-authorization-server","payload":{"issuer":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1","authorization_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/authorize","token_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/token","jwks_uri":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/.well-known/jwks.json","userinfo_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/userinfo","registration_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/clients/register","scopes_supported":["openid","profile","email","phone"],"response_types_supported":["code"],"response_modes_supported":["query"],"grant_types_supported":["authorization_code","refresh_token"],"subject_types_supported":["public"],"id_token_signing_alg_values_supported":["RS256","HS256","ES256"],"token_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post","none"],"claims_supported":["sub","aud","iss","exp","iat","auth_time","nonce","email","email_verified","phone_number","phone_number_verified","name","picture","preferred_username","updated_at"],"code_challenge_methods_supported":["S256","plain"]},"http_status":200,"headers":{"content-type":"application/json","strict-transport-security":"max-age=31536000; includeSubDomains; preload","set-cookie":"__cf_bm=yqe8EXRsSBbUK0LQ3ijP070Db5HlMwoRlU9xHkX.vD0-1780366877.7414494-1.0.1.1-BVtRpfDfLGLMrPo3C1Z_uJ.RsRcDypytISGCvGUGfzwBS2i.PRmT8ayq0N18ziqbKBDI7Cw..z_z0gsZHUEcctitx8FPYIVJG4NLvskNUrDkrUnLYbFTR5EfuMxSG8jC; HttpOnly; SameSite=None; Secure; Path=/; Domain=supabase.co; Expires=Tue, 02 Jun 2026 02:51:17 GMT"}}},"openid_configuration":{"status":"ok","latency_ms":28.44,"details":{"url":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/.well-known/openid-configuration","payload":{"issuer":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1","authorization_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/authorize","token_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/token","jwks_uri":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/.well-known/jwks.json","userinfo_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/userinfo","registration_endpoint":"https://uihohqhbowcrgsjhdmrc.supabase.co/auth/v1/oauth/clients/register","scopes_supported":["openid","profile","email","phone"],"response_types_supported":["code"],"response_modes_supported":["query"],"grant_types_supported":["authorization_code","refresh_token"],"subject_types_supported":["public"],"id_token_signing_alg_values_supported":["RS256","HS256","ES256"],"token_endpoint_auth_methods_supported":["client_secret_basic","client_secret_post","none"],"claims_supported":["sub","aud","iss","exp","iat","auth_time","nonce","email","email_verified","phone_number","phone_number_verified","name","picture","preferred_username","updated_at"],"code_challenge_methods_supported":["S256","plain"]},"http_status":200,"headers":{"content-type":"application/json","strict-transport-security":"max-age=31536000; includeSubDomains; preload"}}},"initialize":{"status":"ok","latency_ms":305.04,"details":{"url":"https://dynamoi.com/mcp","payload":{"result":{"protocolVersion":"2025-03-26","capabilities":{"tools":{"listChanged":true},"prompts":{"listChanged":true},"resources":{"listChanged":true}},"serverInfo":{"name":"dynamoi","version":"0.6.4","websiteUrl":"https://dynamoi.com"},"instructions":"You are operating Dynamoi's tools on behalf of the authenticated user. Dynamoi helps\nmusic artists promote on Spotify and YouTube creators grow channels through managed\nMeta and Google ad campaigns. Smart Links are free to create and manage. High-popularity\nor unverifiable artist links may stay unpublished in verification hold until Dynamoi\ncan verify the client relationship. Managed advertising and ad budgets are separate\npaid campaign services.\n\n=== Session Start Routine ===\n\nWhen the user's first message in a Dynamoi session is account-relevant (artists, campaigns, smart links, billing, connections, launches, or \"what should I do here\"), call dynamoi_get_account_overview first to learn the user's state. The response includes a recommendedNextActions array and a state object — treat that array as authoritative guidance for what to ask or do next.\n\nRoute by state from dynamoi_get_account_overview:\n\n- state.hasAnyArtist === false: This is a brand-new user. Ask whether they are a Spotify artist, a YouTube creator, or a label/manager.\n  - Spotify artist with a URL → call dynamoi_create_smart_links_from_spotify_artist immediately to create their free hub. Read dynamoi://playbooks/spotify-artist for scripted phrasing.\n  - YouTube creator → read dynamoi://playbooks/youtube-creator and explain Dynamoi's revenue-per-view optimization advantage before asking whether they want to link the channel. If yes, call dynamoi_start_youtube_channel_link.\n  - Label or manager with a roster → read dynamoi://playbooks/label-or-manager for the multi-artist setup walkthrough.\n\n- state.hasAnyArtist === true && state.hasAnySmartLink === false: The fastest visible win is a free Smart Link. Offer dynamoi_create_smart_link_from_spotify (single release) or dynamoi_create_smart_links_from_spotify_artist (full catalog) before campaign tools.\n\n- state.hasAnyArtist === true && state.hasAnyActiveCampaign === false: Offer dynamoi_get_campaign_readiness to validate launch inputs without creating anything.\n\n- state.hasAnyArtist === true && billing blocks a launch: tell the user managed-advertising billing setup must happen in the Dynamoi dashboard, not through a ChatGPT checkout link. After they start or restore billing there, poll dynamoi_get_billing for the target artist to confirm billing is active.\n\n- state.hasAnyArtist === true && state.hasAnyConnectedMeta === false and the user wants Spotify Smart Campaigns: only offer dynamoi_start_meta_connection after billing is active. If the tool returns billing_required, route the user to dashboard billing first. If it returns billing_check_unavailable, retry shortly instead of treating the user as unpaid. After Meta browser return, poll dynamoi_get_platform_status for the target artist with the returned onboardingAttemptId and onboardingFlow=meta. Treat platforms.meta.status as complete when it is oauth_complete, partnership_pending, or partnership_active.\n\n- state.hasAnyArtist === true && state.hasAnyConnectedYoutube === false and the user wants YouTube growth: offer dynamoi_start_youtube_channel_link, then poll dynamoi_get_platform_status for the target artist with the returned onboardingAttemptId and onboardingFlow=youtube after the browser return page sends them back to chat. Treat the connection as complete when platforms.youtube.connected is true.\n\nDo NOT call dynamoi_list_artists or dynamoi_search as a first step for brand-new users — both will return empty for them and the conversation stalls. Always go through dynamoi_get_account_overview first.\n\n=== End Session Start Routine ===\n\nPrinciples:\n- Be accurate. If uncertain, ask a clarifying question before acting.\n- Answer general knowledge or advice questions directly without Dynamoi tools unless the user is asking about their Dynamoi account, artists, campaigns, billing, connections, or launches.\n- Do not call Dynamoi tools just to \"check context\" before answering generic advice questions. If the question is about Instagram growth, lyrics, songwriting, promotion strategy, or general marketing education and does not require the user's account data, answer natively and do not mention inspecting Dynamoi.\n- Even when Dynamoi is attached, generic advice stays native. If the user asks something like \"How do I get more followers on Instagram organically without running any ads?\", answer directly with no Dynamoi tool calls.\n- `dynamoi_get_account_overview` is only for explicit account-overview questions. Do not use it as a zero-context scout before answering unrelated prompts.\n- Never claim you changed something unless the tool returned status \"success\" or\n  \"partial_success\".\n- Prefer read tools first before write tools. For writes, confirm intent and restate\n  what will change.\n- After a successful write tool call, answer directly from the returned record instead of chaining more tools just to restate the result.\n- If you truly need a follow-up read after a successful write, use format=summary when available and then stop to answer the user.\n- When a user asks for a daily breakdown, pass granularity=DAILY on the analytics tool call.\n- When a user asks for a written rollup, strongest campaign, or review-ready analytics summary, prefer format=summary on the analytics tool call.\n- If a read tool already returned the requested answer in summary form, answer the user directly instead of chaining more read tools.\n- When a user asks to create a shareable release link, landing page, link-in-bio destination, streaming link, Spotify link page, or free promotion asset, prefer Smart Link tools before campaign tools. Use dynamoi_create_smart_links_from_spotify_artist for Spotify artist URLs when the user wants the artist hub, full catalog, or all Smart Links. Use dynamoi_create_smart_link_from_spotify for a single album or track URL. Do not imply that creating a Smart Link creates a paid campaign.\n- When answering from Smart Link tools, lead with the artist hub URL when present, then public release URLs, release title, artist name, status, and next action. Do not include internal UUIDs unless the user explicitly asks for IDs or you need an ID for a follow-up tool call.\n- Smart Link pixel tools accept validated pixel IDs only. Do not ask for arbitrary JavaScript, tag-manager snippets, or script code.\n- Money values are shown in USD as presented in Dynamoi.\n- Budget minimums: $10/day (daily), $100 total (Smart Campaign), $50 total (YouTube).\n- Product and pricing details are available as MCP resources. Keep runtime answers\n  focused on the user's account data and requested action.\n\nCommon workflows:\n- Discovery: dynamoi_list_artists → dynamoi_list_campaigns → dynamoi_get_campaign →\n  dynamoi_get_campaign with includeAnalytics=true when needed\n- Artist performance summary: dynamoi_get_artist_analytics with granularity=DAILY when requested. If that response already includes the strongest campaign, do not call more analytics tools.\n- Diagnose stuck campaign: dynamoi_get_campaign → dynamoi_get_platform_status →\n  propose next steps\n- Pause/resume: dynamoi_get_campaign (confirm) → dynamoi_update_campaign with action=pause or action=resume\n- Budget update: dynamoi_get_campaign (confirm) → dynamoi_update_campaign with action=update_budget\n- Launch: dynamoi_list_media_assets → dynamoi_launch_campaign\n- Free Smart Link artist catalog creation: dynamoi_create_smart_links_from_spotify_artist; omit artistId for a brand-new user with no Dynamoi artist yet\n- Free Smart Link single-release creation: dynamoi_list_artists → dynamoi_create_smart_link_from_spotify\n- Smart Link analytics/settings: dynamoi_list_smart_links → dynamoi_get_smart_link with includeAnalytics=true or includeArtistSettings=true\n- Post-launch answer: if dynamoi_launch_campaign succeeds, answer from that result directly. Only call dynamoi_get_campaign when the user explicitly needs more detail than the launch result already returned, and prefer format=summary for that follow-up.\n- Review/demo Smart Campaign launch: if the user already gave artist, content title, budget, countries, and reusable media assets, you may call dynamoi_launch_campaign without spotifyUrl/endDate because Dynamoi can infer reviewer-safe defaults. Do not invent placeholder values for omitted fields; omit those keys entirely."},"jsonrpc":"2.0","id":1},"http_status":200,"headers":{"content-type":"text/event-stream","strict-transport-security":"max-age=63072000; includeSubDomains; preload"}}},"protocol_version_probe":{"status":"warning","latency_ms":null,"details":{"claimed_version":"2025-03-26","validator_protocol_version":"2025-03-26","latest_known_version":"2025-11-25","releases_behind":2,"lag_days":244}},"tools_list":{"status":"ok","latency_ms":285.93,"details":{"url":"https://dynamoi.com/mcp","payload":{"result":{"tools":[{"name":"dynamoi_get_account_overview","title":"Get Account Overview","description":"Use this when the user explicitly asks about the signed-in Dynamoi account itself, such as who is logged in, how many organizations or artists it can access, or whether account-level platform connections exist. Always pass intent to match that explicit account question. Do not use this to confirm a specific Meta or YouTube onboarding attempt because this account-level state can span multiple artists; use dynamoi_get_platform_status for the target artist instead. Do not use this to enumerate artists one by one; use dynamoi_list_artists for that. Never use this to 'check context' before answering generic Instagram, lyrics, songwriting, or marketing-advice questions, even if Dynamoi is attached.","inputSchema":{"type":"object","properties":{"format":{"type":"string","enum":["json","summary"]},"intent":{"type":"string","enum":["account_overview","artist_access_check","organization_access_check","platform_connection_check"]}},"required":["intent"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_artists","title":"List Artists","description":"Use this when the user wants to see which artists or YouTube channels they manage, along with billing status, active campaign count, and their role. Pass artistId when you need the full profile/readiness details for one artist instead of a roster page. Do not use this for campaign details; use dynamoi_list_campaigns or dynamoi_get_campaign. Never use this for generic social-media or marketing advice, including Instagram follower-growth questions, unless the user explicitly asked about their Dynamoi roster. If the result is empty, the user is brand-new — do not stop with 'no records found'; route through dynamoi_get_account_overview.recommendedNextActions.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"limit":{"type":"integer","minimum":1,"maximum":50}},"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_search","title":"Search Dynamoi","description":"Use this when the user mentions an artist, release, campaign, or smart link but you do not yet know the exact record to inspect. Do not use this for analytics summaries or billing questions once you already know the target record. If the result is empty for a brand-new user (no artists yet), do not respond 'no records found' as a terminal answer — instead suggest creating their first artist hub via dynamoi_create_smart_links_from_spotify_artist.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"includeArchived":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":50},"query":{"type":"string","maxLength":120},"type":{"type":"string","enum":["artist","campaign","smartlink"]}},"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"search","title":"Search (OpenAI Connectors)","description":"OpenAI ChatGPT Deep Research / Connectors search contract. Returns matching Dynamoi artists, campaigns, and Smart Links so they can be cited in a deep-research session. For regular ChatGPT chat use dynamoi_search instead.","inputSchema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"maxLength":500}},"required":["query"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"fetch","title":"Fetch (OpenAI Connectors)","description":"OpenAI ChatGPT Deep Research / Connectors fetch contract. Given an id returned by `search` (formatted as 'artist:<uuid>', 'campaign:<uuid>', or 'smartlink:<uuid>'), returns the full record for citation.","inputSchema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":200}},"required":["id"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_campaigns","title":"List Campaigns","description":"Use this when the user wants to browse campaigns for one artist, optionally filtered by type or status. Do not use this for a single campaign deep dive; use dynamoi_get_campaign for that. Never use this to personalize generic marketing advice. If the user has no artists yet, do not call this — route via dynamoi_get_account_overview first.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"campaignType":{"type":"string","enum":["SMART_CAMPAIGN","YOUTUBE"]},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"limit":{"type":"integer","minimum":1,"maximum":50},"status":{"type":"string","enum":["AWAITING_SMART_LINK","ACTIVE","ARCHIVED","CONTENT_VALIDATION","DEPLOYING","FAILED","PAUSED","READY_FOR_REVIEW","SUBSCRIPTION_PAUSED"]}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_campaign","title":"Get Campaign","description":"Use this when the user wants full details for one campaign, including budget, targeting, platform status, and next actions. Set includeAnalytics=true for one-campaign performance, includeDeploymentStatus=true for delivery/deployment blockers, and includeCountries=true only when the full country list is needed. Do not use this for a campaign list; use dynamoi_list_campaigns instead. After a successful launch or campaign mutation, prefer format=summary when you need a follow-up read to relay the final answer.","inputSchema":{"type":"object","properties":{"analyticsDateRange":{"type":"object","properties":{"end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["end","start"],"additionalProperties":false},"analyticsGranularity":{"type":"string","enum":["TOTAL","DAILY"]},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"includeAnalytics":{"type":"boolean"},"includeCountries":{"type":"boolean"},"includeDeploymentStatus":{"type":"boolean"}},"required":["campaignId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_artist_analytics","title":"Get Artist Analytics","description":"Use this when the user wants artist-level performance across all campaigns, including 30-day rollups or daily breakdowns. Pass granularity=DAILY when the user asks for a daily breakdown. Pass format=summary when the user wants a written rollup, a strongest-campaign verdict, or a direct answer you can relay immediately. If this tool already returned the requested strongest-campaign comparison, stop and answer instead of calling more analytics tools. For one campaign's metrics, use dynamoi_get_campaign with includeAnalytics=true.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"dateRange":{"type":"object","properties":{"end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["end","start"],"additionalProperties":false},"format":{"type":"string","enum":["json","summary"]},"granularity":{"type":"string","enum":["TOTAL","DAILY"]}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_billing","title":"Get Billing","description":"Use this when the user asks about billing state, credit balance, promo limits, subscription status, or whether billing blocks launches for one artist. This is a read-only status check; it does not create checkout links or collect payment. If billing blocks a launch, direct the user to start or restore managed advertising in the Dynamoi dashboard, then call this tool again to confirm the status. Do not use this for campaign analytics or platform connection troubleshooting.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"onboardingAttemptId":{"type":"string","minLength":1,"maxLength":120}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_platform_status","title":"Get Platform Status","description":"Use this when the user wants to know whether Spotify, Meta, or YouTube are connected and what setup steps still block launches. When polling after a connection-start flow, pass the returned onboardingAttemptId and onboardingFlow so Dynamoi ops can correlate the browser step. Do not use this for detailed billing questions. Never use this to personalize generic Instagram or marketing-advice questions.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"onboardingAttemptId":{"type":"string","minLength":1,"maxLength":120},"onboardingFlow":{"type":"string","enum":["meta","youtube"]}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_available_countries","title":"List Available Countries","description":"Use this when the user asks which countries they can target for a Smart Campaign or YouTube campaign. Always pass campaignType because Smart Campaign and YouTube country catalogs are different. Do not use this for generic country marketing advice.","inputSchema":{"type":"object","properties":{"campaignType":{"type":"string","enum":["SMART_CAMPAIGN","YOUTUBE"]},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"limit":{"type":"integer","minimum":1,"maximum":100},"query":{"type":"string","maxLength":120}},"required":["campaignType"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_campaign_readiness","title":"Get Campaign Readiness","description":"Use this when the user is planning a campaign and wants to know if the proposed inputs are ready before dynamoi_launch_campaign. This validates readiness and targeting without creating a campaign. Do not use this to create or mutate campaigns.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"budgetAmount":{"type":"number","exclusiveMinimum":0},"budgetType":{"type":"string","enum":["DAILY","TOTAL"]},"campaignType":{"type":"string","enum":["SMART_CAMPAIGN","YOUTUBE"]},"contentType":{"type":"string","enum":["TRACK","ALBUM","PLAYLIST","VIDEO"]},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"format":{"type":"string","enum":["json","summary"]},"locationTargets":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":8},"name":{"type":"string","minLength":1,"maxLength":120}},"required":["code","name"],"additionalProperties":false}},"mediaAssetIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"spotifyUrl":{"type":"string","minLength":1,"maxLength":500},"youtubeVideoId":{"type":"string","minLength":1,"maxLength":128}},"required":["artistId","campaignType"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_start_youtube_channel_link","title":"Start YouTube Channel Link","description":"Use this when the user is ready to link a YouTube channel to one Dynamoi artist from chat. This returns a Google OAuth URL bound to the signed-in user and artist. Google returns to a Dynamoi page that tells the user to come back to the AI assistant; after that, poll dynamoi_get_platform_status with the returned onboardingAttemptId and onboardingFlow=youtube until platforms.youtube.connected is true.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"userIntentSummary":{"type":"string","maxLength":500}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_start_meta_connection","title":"Start Meta Connection","description":"Use this when billing is active and the user is ready to connect Meta for Spotify Smart Campaigns from chat. This returns a signed Meta OAuth URL and may send the user through a Page/Instagram selection step before the chat-first return page. If billing is not active, it returns billing_required instead of an OAuth URL. If billing cannot be verified due to a transient snapshot/API issue, it returns billing_check_unavailable and should be retried shortly. After the user returns, poll dynamoi_get_platform_status with the returned onboardingAttemptId and onboardingFlow=meta until platforms.meta.status is oauth_complete, partnership_pending, or partnership_active.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"userIntentSummary":{"type":"string","maxLength":500}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_update_campaign","title":"Update Campaign","description":"Use this when the user explicitly wants to pause, resume, or update the budget/end date for an existing campaign. Set action to pause, resume, or update_budget. Do not use this for inspection-only questions; this changes live campaign workflow state or external campaign settings.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["pause","resume","update_budget"]},"budgetAmount":{"type":"number","exclusiveMinimum":0},"campaignId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"expectedCurrentBudgetAmount":{"type":"number","exclusiveMinimum":0},"expectedCurrentEndDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"expectedCurrentStatus":{"type":"string","enum":["AWAITING_SMART_LINK","ACTIVE","ARCHIVED","CONTENT_VALIDATION","DEPLOYING","ENDED","FAILED","PAUSED","READY_FOR_REVIEW","SUBSCRIPTION_PAUSED"]},"userIntentSummary":{"type":"string","maxLength":500}},"required":["action","campaignId"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_media_assets","title":"List Media Assets","description":"Use this when the user wants to choose from uploaded images or videos that can be reused in a campaign launch. Do not use this when the user only wants campaign status or analytics. Use format=json when you need asset IDs for a follow-up launch. Request includeUrls only when the assistant must display or inspect public-safe asset URLs.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"includeUrls":{"type":"boolean"},"limit":{"type":"integer","minimum":1,"maximum":50}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_launch_campaign","title":"Start Campaign Launch Workflow","description":"Use this when the user explicitly wants to create a new Smart Campaign or YouTube Campaign and start the launch workflow with provided details. Ads are not necessarily live until the returned delivery state is ACTIVE. For review or demo Smart Campaign launches that already specify the artist, content title, budget, countries, and reusable media assets, you may omit spotifyUrl and endDate because Dynamoi can infer reviewer-safe defaults. Do not invent placeholder spotifyUrl or endDate values for those review/demo launches; omit them and let Dynamoi infer them. After a successful launch, answer from the returned campaign details directly instead of chaining more tools unless the user explicitly asked for more. Do not use this for recommendations or previews; this creates a real campaign workflow or demo-safe simulated campaign.","inputSchema":{"type":"object","properties":{"adCopy":{"type":"string","maxLength":500},"appleMusicUrl":{"type":"string","minLength":1,"maxLength":500},"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"budgetAmount":{"type":"number","exclusiveMinimum":0},"budgetSplits":{"type":"object","propertyNames":{"type":"string","enum":["META","GOOGLE"]},"additionalProperties":{"type":"integer","minimum":0,"maximum":100},"required":["META","GOOGLE"]},"budgetType":{"type":"string","enum":["DAILY","TOTAL"]},"campaignType":{"type":"string","enum":["SMART_CAMPAIGN","YOUTUBE"]},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"contentTitle":{"type":"string","minLength":1,"maxLength":160},"contentType":{"type":"string","enum":["TRACK","ALBUM","PLAYLIST","VIDEO"]},"endDate":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"locationTargets":{"type":"array","items":{"type":"object","properties":{"code":{"type":"string","minLength":1,"maxLength":8},"name":{"type":"string","minLength":1,"maxLength":120}},"required":["code","name"],"additionalProperties":false}},"mediaAssetIds":{"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"spotifyUrl":{"type":"string","minLength":1,"maxLength":500},"useAiGeneratedCopy":{"type":"boolean"},"userIntentSummary":{"type":"string","maxLength":500},"youtubeVideoId":{"type":"string","minLength":1,"maxLength":128}},"required":["artistId","budgetAmount","budgetSplits","budgetType","campaignType","clientRequestId","contentTitle","contentType"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_create_smart_link_from_spotify","title":"Create Free Smart Link from Spotify","description":"Use this when the user wants to create one free Dynamoi Smart Link from a Spotify album or track URL/URI, or a single starter release from a Spotify artist URL. For full-catalog artist imports or artist hub requests, prefer dynamoi_create_smart_links_from_spotify_artist. Smart Links are free to create and manage. High-popularity or unverifiable artist links may stay unpublished in verification hold until Dynamoi can verify the client relationship. This does not create a paid ad campaign. Spotify playlist URLs are not supported today. If the Smart Link already exists, return the existing link instead of creating a duplicate; if customDescription is provided, update that Smart Link's public description. In the final answer, lead with the public URL and do not expose internal IDs unless asked.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"customDescription":{"type":"string","maxLength":500},"format":{"type":"string","enum":["json","summary"]},"spotifyUrl":{"type":"string","minLength":1,"maxLength":500},"userIntentSummary":{"type":"string","maxLength":500}},"required":["artistId","spotifyUrl"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_create_smart_links_from_spotify_artist","title":"Create Free Smart Links for Spotify Artist","description":"Use this when the user gives a Spotify artist URL and wants Dynamoi to create, import, or refresh free Smart Links for the artist catalog and return the artist hub. If the signed-in user has no Dynamoi artist yet, omit artistId so Dynamoi can create the first artist from the Spotify artist profile. This starts the background catalog import so the user does not need to open the dashboard. Smart Links are free to create and manage. High-popularity or unverifiable artist catalog links may stay unpublished in verification hold until Dynamoi can verify the client relationship. This does not create a paid ad campaign. In the final answer, lead with the artist hub URL and current public Smart Link URLs; do not expose internal IDs unless asked.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"format":{"type":"string","enum":["json","summary"]},"spotifyArtistUrl":{"type":"string","minLength":1,"maxLength":500},"userIntentSummary":{"type":"string","maxLength":500}},"required":["spotifyArtistUrl"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_list_smart_links","title":"List Smart Links","description":"Use this when the user wants to list free Smart Links for one artist, including release title, public URL, publish state, claim state, render state, and theme. Do not use this for paid campaign lists; use dynamoi_list_campaigns for campaigns. In the final answer, show public URLs and avoid internal IDs unless asked. If empty for an artist with connected Spotify, suggest dynamoi_create_smart_links_from_spotify_artist for catalog import or dynamoi_create_smart_link_from_spotify for one release instead of stopping at 'no Smart Links yet'.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"cursor":{"type":"string"},"format":{"type":"string","enum":["json","summary"]},"limit":{"type":"integer","minimum":1,"maximum":50},"query":{"type":"string","maxLength":120},"claimStatus":{"type":"string","enum":["auto_approved","pending_ops_review","verification_deferred","approved_by_ops","rejected"]},"publishState":{"type":"string","enum":["published","unpublished"]},"renderState":{"type":"string","enum":["queued","rendering","rendered","failed"]}},"required":["artistId"],"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_get_smart_link","title":"Get Smart Link","description":"Use this when the user wants full details for one free Smart Link, including release, Spotify URL, public play.dynamoi.com URL, current status, theme source, and next actions. Set includeAnalytics=true for visit/click analytics and includeArtistSettings=true for artist-level theme/pixel settings. In the final answer, lead with the public URL and do not expose internal IDs unless asked.","inputSchema":{"type":"object","properties":{"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"dateRange":{"type":"object","properties":{"end":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},"start":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"}},"required":["end","start"],"additionalProperties":false},"format":{"type":"string","enum":["json","summary"]},"granularity":{"type":"string","enum":["TOTAL","DAILY"]},"includeAnalytics":{"type":"boolean"},"includeArtistSettings":{"type":"boolean"},"includeBreakdowns":{"type":"boolean"},"playLinkId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"spotifyUrl":{"type":"string","minLength":1,"maxLength":500}},"additionalProperties":false},"annotations":{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},{"name":"dynamoi_update_smart_link","title":"Update Smart Link","description":"Use this when the user wants to change one Smart Link's public description, publish/unpublish the public landing page, or update artist-level Smart Link theme/pixel settings. Set action to update_description, publish, unpublish, or update_artist_settings. This updates public landing-page behavior and may queue background rendering.","inputSchema":{"type":"object","properties":{"action":{"type":"string","enum":["update_description","update_artist_settings","publish","unpublish"]},"artistId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"clientRequestId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"customDescription":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"expectedPublishState":{"type":"string","enum":["published","unpublished"]},"expectedUpdatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z))$"},"googleAdsConversionId":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}]},"metaPixelId":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}]},"playLinkId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"theme":{"type":"string","enum":["classic","brutalist","aurora","cinematic"]},"tiktokPixelId":{"anyOf":[{"type":"string","maxLength":32},{"type":"null"}]},"userIntentSummary":{"type":"string","maxLength":500}},"required":["action"],"additionalProperties":false},"annotations":{"destructiveHint":true,"idempotentHint":true,"openWorldHint":true,"readOnlyHint":false},"execution":{"taskSupport":"forbidden"},"_meta":{"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]},"outputSchema":{"type":"object","properties":{"status":{"type":"string","enum":["success","partial_success","error"]}},"required":["status"],"additionalProperties":{}},"securitySchemes":[{"scopes":["email","profile"],"type":"oauth2"}]}]},"jsonrpc":"2.0","id":2},"http_status":200,"headers":{"content-type":"text/event-stream","strict-transport-security":"max-age=63072000; includeSubDomains; preload"}}},"prompts_list":{"status":"ok","latency_ms":99.69,"details":{"url":"https://dynamoi.com/mcp","payload":{"result":{"prompts":[{"name":"dynamoi_find_smart_link_url","title":"Find Smart Link URL","description":"Find a user's free Smart Link URL and answer with public URLs, titles, and statuses.","arguments":[{"name":"artistId","required":false},{"name":"query","required":false}]},{"name":"dynamoi_explain_free_smart_links","title":"Explain Free Smart Links","description":"Explain Dynamoi free Smart Links and how they differ from paid managed advertising.","arguments":[]},{"name":"dynamoi_create_free_smart_link","title":"Create Free Smart Link","description":"Create free Smart Links from a Spotify artist, album, or track URL.","arguments":[{"name":"artistId","required":false},{"name":"spotifyUrl","required":false}]},{"name":"dynamoi_audit_campaigns","title":"Audit Campaigns","description":"Audit an artist's campaigns and summarize what is working and what to fix next.","arguments":[{"name":"artistId","required":false}]},{"name":"dynamoi_release_launch_plan","title":"Release Launch Plan","description":"Create a pragmatic release launch plan and propose a Dynamoi campaign setup.","arguments":[{"name":"artistId","required":false},{"name":"contentTitle","required":false},{"name":"contentType","required":false}]},{"name":"dynamoi_why_campaign_blocked","title":"Why Is My Campaign Blocked?","description":"Diagnose why a campaign is blocked/stuck and recommend the next fix.","arguments":[{"name":"campaignId","required":true}]}]},"jsonrpc":"2.0","id":3},"http_status":200,"headers":{"content-type":"text/event-stream","strict-transport-security":"max-age=63072000; includeSubDomains; preload"}}},"prompt_get":{"status":"auth_required","latency_ms":89.44,"details":{"url":"https://dynamoi.com/mcp","error":"Client error '401 Unauthorized' for url 'https://dynamoi.com/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401","http_status":401,"payload":{},"headers":{"strict-transport-security":"max-age=63072000; includeSubDomains; preload","www-authenticate":"Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""},"reason":"auth_required","prompt_name":"dynamoi_find_smart_link_url","prompt_arguments":[{"name":"artistId","required":false},{"name":"query","required":false}]}},"resources_list":{"status":"ok","latency_ms":158.29,"details":{"url":"https://dynamoi.com/mcp","payload":{"result":{"resources":[{"uri":"dynamoi://platform/pricing","name":"platform-pricing","description":"Dynamoi campaign setup guidance and campaign budget minimums.","mimeType":"application/json","title":"Pricing"},{"uri":"dynamoi://platform/content-types","name":"platform-content-types","mimeType":"application/json","title":"Content Types"},{"uri":"dynamoi://platform/country-targeting","name":"platform-country-targeting","description":"Explains Smart Campaign vs YouTube country-targeting catalogs.","mimeType":"application/json","title":"Country Targeting"},{"uri":"dynamoi://platform/supported-countries","name":"platform-supported-countries","description":"Legacy alias for country-targeting guidance. Use dynamoi://platform/country-targeting for the canonical resource.","mimeType":"application/json","title":"Supported Countries"},{"uri":"dynamoi://smart-links/free-plan","name":"smart-links-free-plan","description":"Canonical explanation of Dynamoi's free Smart Links plan and how it differs from paid managed advertising.","mimeType":"application/json","title":"Free Smart Links"},{"uri":"dynamoi://smart-links/capabilities","name":"smart-links-capabilities","mimeType":"application/json","title":"Smart Link Capabilities"},{"uri":"dynamoi://business/free-vs-paid","name":"business-free-vs-paid","description":"Clear boundary between free Dynamoi Smart Links and paid managed advertising.","mimeType":"application/json","title":"Free Smart Links vs Paid Campaigns"},{"uri":"dynamoi://smart-links/agent-guide","name":"smart-links-agent-guide","description":"How agents should answer Smart Link questions using Dynamoi MCP tools.","mimeType":"application/json","title":"Smart Link Agent Guide"},{"uri":"dynamoi://mcp/tool-answering-rules","name":"mcp-tool-answering-rules","description":"General answer rules for Dynamoi MCP tools so agents stop after useful results.","mimeType":"application/json","title":"MCP Tool Answering Rules"},{"uri":"dynamoi://playbooks/spotify-artist","name":"playbook-spotify-artist","description":"Persona playbook: how to convert a Spotify artist user from auth-grant to first activated Smart Link.","mimeType":"application/json","title":"Playbook: Spotify Artist"},{"uri":"dynamoi://playbooks/youtube-creator","name":"playbook-youtube-creator","description":"Persona playbook: how to introduce a YouTube creator to Dynamoi's revenue-per-view optimization advantage.","mimeType":"application/json","title":"Playbook: YouTube Creator"},{"uri":"dynamoi://playbooks/label-or-manager","name":"playbook-label-or-manager","description":"Persona playbook: how to onboard a label, manager, or anyone running a roster of multiple artists.","mimeType":"application/json","title":"Playbook: Label or Manager"},{"uri":"dynamoi://playbooks/onboarding-tree","name":"playbook-onboarding-tree","description":"Decision tree for routing a brand-new MCP user to the right persona playbook based on their first reply.","mimeType":"application/json","title":"Playbook: Onboarding Decision Tree"},{"uri":"dynamoi://music-marketing/when-to-use-dynamoi","name":"music-marketing-when-to-use-dynamoi","description":"When an assistant should use Dynamoi account tools versus answering music marketing questions natively.","mimeType":"application/json","title":"When To Use Dynamoi"},{"uri":"dynamoi://platform/campaign-statuses","name":"platform-campaign-statuses","mimeType":"application/json","title":"Campaign Statuses"}]},"jsonrpc":"2.0","id":5},"http_status":200,"headers":{"content-type":"text/event-stream","strict-transport-security":"max-age=63072000; includeSubDomains; preload"}}},"resource_read":{"status":"auth_required","latency_ms":133.21,"details":{"url":"https://dynamoi.com/mcp","error":"Client error '401 Unauthorized' for url 'https://dynamoi.com/mcp'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/401","http_status":401,"payload":{},"headers":{"strict-transport-security":"max-age=63072000; includeSubDomains; preload","www-authenticate":"Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""},"reason":"auth_required","resource_uri":"dynamoi://platform/pricing"}},"probe_noise_resilience":{"status":"ok","latency_ms":33.58,"details":{"url":"https://dynamoi.com/robots.txt","http_status":200,"headers":{"content-type":"text/plain"}}},"determinism_probe":{"status":"ok","latency_ms":167.13,"details":{"attempts":2,"successful":2,"matches":2,"stable_ratio":1.0,"baseline_signature":"847ffc4683249e0a8416f17711b95eb75d049b539fafa5d309cc70378b52d0aa","errors":[]}},"session_resume_probe":{"status":"warning","latency_ms":null,"details":{"reason":"no_session_id","transport":"streamable-http","resume_expected":true,"protocol_version":"2025-03-26"}},"step_up_auth_probe":{"status":"warning","latency_ms":null,"details":{"oauth_present":true,"auth_required_checks":["prompt_get","resource_read"],"supported_scopes":["email","openid","phone","profile"],"scope_specificity_ratio":0.2,"broad_scopes":[],"challenge_headers":["Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\"","Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""],"step_up_signals":["Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\"","Bearer resource_metadata=\"https://dynamoi.com/.well-known/oauth-protected-resource\", scope=\"email profile\", error=\"invalid_token\", error_description=\"Sign in to Dynamoi to continue.\""],"minimal_scope_documented":false}},"transport_compliance_probe":{"status":"warning","latency_ms":86.91,"details":{"transport":"streamable-http","session_id_present":false,"protocol_header_present":false,"last_event_id_visible":false,"requested_protocol_version":"2025-03-26","bad_protocol_status_code":400,"bad_protocol_payload":{"jsonrpc":"2.0","error":{"code":-32000,"message":"Bad Request: Unsupported protocol version: 1999-99-99 (supported versions: 2025-11-25, 2025-06-18, 2025-03-26, 2024-11-05, 2024-10-07)"},"id":null},"bad_protocol_headers":{"content-type":"application/json","strict-transport-security":"max-age=63072000; includeSubDomains; preload"},"bad_protocol_error":null,"delete_status_code":null,"delete_error":null,"expired_session_status_code":null,"expired_session_error":null,"issues":["missing_session_id","missing_protocol_header"]}},"utility_coverage_probe":{"status":"ok","latency_ms":51.1,"details":{"completions":{"advertised":false,"sample_target":{"type":"prompt","name":"dynamoi_find_smart_link_url","argument_name":"artistId"},"live_probe":"not_executed"},"pagination":{"supported":false,"next_cursor_methods":[],"metadata_signal":false},"tasks":{"advertised":false,"probe_status":"auth_required","http_status":401},"initialize_capability_keys":["prompts","resources","tools"]}},"advanced_capabilities_probe":{"status":"ok","latency_ms":null,"details":{"capabilities":{"prompts":true,"resources":true,"completions":false,"roots":false,"sampling":false,"elicitation":false,"structured_outputs":true,"resource_links":true},"enabled_count":4,"enabled":["prompts","resource_links","resources","structured_outputs"],"initialize_capability_keys":["prompts","resources","tools"]}},"tool_snapshot_probe":{"status":"ok","latency_ms":null,"details":{"current_tool_count":22,"previous_tool_count":22,"similarity":1.0,"added":[],"removed":[],"changed_outputs":[]}},"connector_replay_probe":{"status":"ok","latency_ms":null,"details":{"backward_compatible":true,"would_break_after_refresh":false,"added_tools":[],"removed_tools":[],"required_arg_breaks":[],"output_breaks":[],"additive_output_changes":[]}},"request_association_probe":{"status":"missing","latency_ms":null,"details":{"reason":"no_request_association_capabilities_advertised"}},"interactive_flow_probe":{"status":"ok","latency_ms":null,"details":{"risk_hits":[],"safe_hits":["oauth","browser"],"oauth_supported":true,"prompt_available":false}},"action_safety_probe":{"status":"warning","latency_ms":null,"details":{"summary":{"tool_count":22,"high_risk_tools":11,"destructive_tools":0,"exec_tools":4,"egress_tools":7,"secret_tools":3,"bulk_access_tools":17,"risk_distribution":{"low":1,"medium":10,"high":11,"critical":0},"capability_distribution":{"read":20,"admin":20,"export":17,"filesystem":3,"write":14,"exec":4,"secrets":3,"network":13}},"auth_present":true,"safeguard_count":2,"confirmation_signals":["dynamoi_get_account_overview","dynamoi_get_billing","dynamoi_launch_campaign"]}},"official_registry_probe":{"status":"ok","latency_ms":null,"details":{"registry_source":"official_registry","registry_identifier":"io.github.getDynamoi/dynamoi","direct_match":true,"official_peer_count":1}},"provenance_divergence_probe":{"status":"ok","latency_ms":null,"details":{"direct_official_match":true,"registry_title":null,"server_card_title":"Dynamoi","registry_version":null,"server_card_version":"0.6.4","registry_homepage":null,"server_card_homepage":null,"registry_repository":null,"server_card_repository":"https://github.com/getDynamoi/mcp","drift_fields":[],"metadata_document_count":3}},"connector_publishability_probe":{"status":"ok","latency_ms":null,"details":{"transport":"streamable-http","tool_count":22,"high_risk_tools":11,"blockers":[],"criteria":{"remote_transport":true,"initialize":true,"tools_list":true,"protocol_version":true,"session_resume":true,"step_up_auth":true,"transport_compliance":true,"connector_replay":true,"request_association":true,"action_safety":true,"server_card":true,"tool_surface":true,"auth_flow":true}}}},"score_components":{"auth_operability_score":4.0,"error_contract_score":3.0,"rate_limit_semantics_score":2.0,"schema_completeness_score":3.0,"backward_compatibility_score":4.0,"slo_health_score":3.0,"security_hygiene_score":4.0,"task_success_score":4.0,"trust_confidence_score":3.0,"abuse_noise_ratio_score":4.0,"prompt_contract_score":3.0,"resource_contract_score":4.0,"discovery_metadata_score":2.0,"registry_consistency_score":2.0,"installability_score":4.0,"session_semantics_score":4.0,"tool_surface_design_score":4.0,"result_shape_stability_score":4.0,"oauth_interop_score":4.0,"recovery_semantics_score":2.5,"maintenance_signal_score":3.0,"adoption_signal_score":3.0,"freshness_confidence_score":4.0,"transport_fidelity_score":4.0,"spec_recency_score":2.0,"session_resume_score":3.0,"step_up_auth_score":3.0,"transport_compliance_score":2.0,"utility_coverage_score":2.0,"advanced_capability_coverage_score":3.0,"connector_publishability_score":4.0,"tool_snapshot_churn_score":4.0,"connector_replay_score":4.0,"request_association_score":3.0,"interactive_flow_safety_score":4.0,"action_safety_score":2.0,"official_registry_presence_score":4.0,"provenance_divergence_score":4.0,"safety_transparency_score":3.0,"tool_capability_clarity_score":3.0,"destructive_operation_safety_score":3.0,"egress_ssrf_resilience_score":2.0,"execution_sandbox_safety_score":3.75,"data_exfiltration_resilience_score":2.0,"least_privilege_scope_score":3.0,"secret_handling_hygiene_score":2.0,"dependency_supply_chain_signal_score":2.0,"input_sanitization_safety_score":3.0,"tool_namespace_clarity_score":4.0},"validation_schema_version":"16d1d270090d6c8f","started_at":"2026-06-02T02:21:17.587234+00:00","completed_at":"2026-06-02T02:21:19.679672+00:00"},"current_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_73b802bc52eceaf3","generated_at":"2026-06-18T11:55:38.707039+00:00","source":"current_snapshot","server":"io.github.getDynamoi/dynamoi","last_validated_at":"2026-06-02T02:21:19.679672+00:00","validation_age_hours":393.57,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-06-02T02:21:19.679672+00:00","age_hours":393.57,"bucket":"verified_last_30d","label":"Verified in last 30d","badges":["verified_last_30d"],"freshness_sla_hours":168.0,"freshness_sla_status":"breached","stale_score_suppressed":false,"display_score":79.72,"raw_score":79.72,"confidence_score":65.0,"confidence_weighted_score":36.3,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":false,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":false,"priority_revalidation":true}]},"current_status":"healthy","current_score":79.72,"display_score":79.72,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Block for production","why":"stale validation evidence + exec-capable tools + no confirmation safeguards + high-risk tools need review","next_action":"revalidate, add safeguards, export policy","reason_count":4},"production_readiness_class":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first."},"evidence_confidence":{"score":65.0,"label":"medium","validation_age_hours":393.57,"live_check_count":26},"active_alerts":[{"code":"validation_stale","severity":"medium","title":"Validation evidence is outside TrustOps SLA"}]},"trust_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_73b802bc52eceaf3","generated_at":"2026-06-18T11:55:38.707039+00:00","source":"current_snapshot","server":"io.github.getDynamoi/dynamoi","last_validated_at":"2026-06-02T02:21:19.679672+00:00","validation_age_hours":393.57,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-06-02T02:21:19.679672+00:00","age_hours":393.57,"bucket":"verified_last_30d","label":"Verified in last 30d","badges":["verified_last_30d"],"freshness_sla_hours":168.0,"freshness_sla_status":"breached","stale_score_suppressed":false,"display_score":79.72,"raw_score":79.72,"confidence_score":65.0,"confidence_weighted_score":36.3,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":false,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":false,"priority_revalidation":true}]},"current_status":"healthy","current_score":79.72,"display_score":79.72,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Block for production","why":"stale validation evidence + exec-capable tools + no confirmation safeguards + high-risk tools need review","next_action":"revalidate, add safeguards, export policy","reason_count":4},"production_readiness_class":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first."},"evidence_confidence":{"score":65.0,"label":"medium","validation_age_hours":393.57,"live_check_count":26},"active_alerts":[{"code":"validation_stale","severity":"medium","title":"Validation evidence is outside TrustOps SLA"}]},"snapshot_invariant":{"schema_version":"verify.snapshot_invariant.v1","server":"io.github.getDynamoi/dynamoi","ok":true,"surface_snapshot_ids":{"page":"trustsnap_73b802bc52eceaf3","badge":null,"report":"trustsnap_73b802bc52eceaf3","policy":null},"checked_at":"2026-06-18T11:55:40.770832+00:00"},"history":{"points":[{"timestamp":"2026-05-20T20:52:06.684918+00:00","score":78.19,"status":"healthy","latency_ms":1639.72,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-21T08:55:30.730323+00:00","score":78.7,"status":"healthy","latency_ms":1958.69,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-21T21:01:40.095515+00:00","score":78.7,"status":"healthy","latency_ms":2455.21,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-22T09:02:53.307445+00:00","score":78.7,"status":"healthy","latency_ms":1473.25,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-22T21:04:24.742940+00:00","score":78.7,"status":"healthy","latency_ms":1764.09,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-23T09:05:58.168336+00:00","score":78.7,"status":"healthy","latency_ms":1329.41,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-23T21:06:41.425693+00:00","score":78.7,"status":"healthy","latency_ms":1747.87,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-24T09:07:13.304668+00:00","score":78.7,"status":"healthy","latency_ms":2060.91,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-24T21:08:39.080358+00:00","score":78.7,"status":"healthy","latency_ms":1909.94,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-25T09:09:22.615075+00:00","score":79.21,"status":"healthy","latency_ms":1867.23,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-25T21:10:23.525104+00:00","score":79.21,"status":"healthy","latency_ms":2546.04,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-26T09:10:37.698118+00:00","score":79.72,"status":"healthy","latency_ms":2027.25,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-26T21:23:41.672179+00:00","score":79.72,"status":"healthy","latency_ms":1828.61,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-27T09:24:32.646829+00:00","score":79.72,"status":"healthy","latency_ms":2008.67,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-27T21:57:09.910094+00:00","score":79.72,"status":"healthy","latency_ms":2179.95,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-28T09:59:17.547013+00:00","score":79.72,"status":"healthy","latency_ms":1602.54,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-28T22:03:21.830600+00:00","score":79.72,"status":"healthy","latency_ms":1869.34,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-05-29T10:07:32.528596+00:00","score":79.72,"status":"healthy","latency_ms":1814.18,"tool_count":0,"prompt_count":0,"resource_count":0},{"timestamp":"2026-06-01T07:11:46.353440+00:00","score":78.7,"status":"healthy","latency_ms":3654.63,"tool_count":22,"prompt_count":6,"resource_count":15},{"timestamp":"2026-06-02T02:21:19.679672+00:00","score":79.72,"status":"healthy","latency_ms":2089.27,"tool_count":22,"prompt_count":6,"resource_count":15}],"status_counts":{"healthy":20},"score_delta_7d":0.0,"score_delta_30d":null,"avg_latency_ms":1991.34,"healthy_ratio_recent":1.0,"freshness_hours":393.57,"latest_status":"healthy"},"production_readiness":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first.","badge":"score-low","critical_alerts":0},"agent_commerce_readiness":{"status":"beta","commerce_signal":"strong","payment_execution_detected":"yes","billing_or_usage_detected":"yes","quote_or_pricing_detected":"no","numeric_price_context":"yes","commercial_quote_context":"no","checkout_or_charge_detected":"yes","checkout_term_observed":"yes","payment_capable":"observed","payment_rails":[],"purchase_stage_supported":["usage_metering","checkout_redirect","payment_initiation"],"human_confirmation_required":"yes","spending_policy_supported":"yes","receipt_supported":"unknown","refund_policy_present":"unknown","operator_identity":"declared","auth_required":"yes","auth_scheme":"oauth","tool_risk_level":"financial_action","tool_risk_score":85,"pricing_transparency":"clear","schema_change_detected":"unknown","delegation_level":"policy_limited_autonomous_purchase","evidence_level":"observed","confidence":"high","highest_risk_tools":[{"name":"dynamoi_get_account_overview","risk_level":"administrative"},{"name":"dynamoi_list_artists","risk_level":"administrative"},{"name":"dynamoi_search","risk_level":"administrative"},{"name":"dynamoi_list_campaigns","risk_level":"administrative"},{"name":"dynamoi_get_campaign","risk_level":"administrative"},{"name":"dynamoi_get_artist_analytics","risk_level":"administrative"},{"name":"dynamoi_get_billing","risk_level":"financial_action"},{"name":"dynamoi_get_platform_status","risk_level":"administrative"},{"name":"dynamoi_list_available_countries","risk_level":"administrative"},{"name":"dynamoi_get_campaign_readiness","risk_level":"administrative"}],"skipped_unsafe_tools":["dynamoi_get_account_overview","dynamoi_list_artists","dynamoi_search","dynamoi_list_campaigns","dynamoi_get_campaign","dynamoi_get_artist_analytics","dynamoi_get_billing","dynamoi_get_platform_status","dynamoi_list_available_countries","dynamoi_get_campaign_readiness","dynamoi_start_youtube_channel_link","dynamoi_start_meta_connection","dynamoi_update_campaign","dynamoi_list_media_assets","dynamoi_launch_campaign","dynamoi_create_smart_link_from_spotify","dynamoi_create_smart_links_from_spotify_artist","dynamoi_list_smart_links","dynamoi_get_smart_link","dynamoi_update_smart_link"],"last_checked_at":"2026-06-18T11:55:38.686540+00:00","evidence":[{"field":"commerce_signal","value":"strong","evidence_level":"observed","source":"tool_schema","matched_terms":["checkout","payment","subscription","billing","credit","limit","limits","balance"],"sample":"dynamoi_list_artists","confidence":"high","last_checked_at":"2026-06-18T11:55:38.686540+00:00"}],"disclaimer":"Beta assessment. Verify detects evidence and risk signals but does not certify that this server is safe for autonomous purchases.","scores":{"auth_posture_score":90,"tool_risk_score":85,"payment_readiness_score":100,"agent_delegation_safety_score":85,"overall_agent_commerce_score":84},"warnings":[],"recommended_fixes":["Separate quote/cart tools from charge/settlement tools.","Require explicit user confirmation for payment execution.","Return amount, currency, merchant, and receipt identifiers.","Publish pricing and refund/cancellation policy.","Add operator identity metadata.","Add spending policy support or mandate constraints."]},"evidence_confidence":{"score":65.0,"label":"medium","reason":"Based on 20 recent validations, 26 captured checks, and validation age of 393.6 hours.","live_check_count":26,"validation_age_hours":393.57},"recommended_for":[{"label":"OpenAI connectors","reason":"OpenAI connectors is marked compatible with score 100."},{"label":"Claude Desktop","reason":"Claude Desktop is marked compatible with score 100."},{"label":"Smithery","reason":"Smithery is marked compatible with score 100."},{"label":"Generic Streamable HTTP","reason":"Generic Streamable HTTP is marked compatible with score 100."}],"active_alerts":[{"code":"validation_stale","severity":"medium","title":"Validation evidence is outside TrustOps SLA","message":"Latest validation is 393.6 hours old, beyond the configured 24h TrustOps alert threshold."}],"remediations":[{"code":"add_confirmation_semantics","severity":"high","title":"Add confirmation and dry-run semantics for risky actions","why":"High-risk write, delete, exec, or egress tools should communicate safeguards clearly.","action":"Inspect the latest validation evidence and resolve the client-visible regression.","playbook":["Inspect the latest validation evidence.","Resolve the highest-severity client-facing gap first.","Revalidate and confirm the score and verdict improve."],"maintainer_context":null},{"code":"fix_transport_compliance","severity":"high","title":"Align session and protocol behavior with Streamable HTTP expectations","why":"Clients increasingly rely on MCP-Protocol-Version, session teardown, and expired-session semantics.","action":"Align MCP-Protocol-Version, MCP-Session-Id, DELETE teardown, and expired-session handling with the transport spec.","playbook":["Return `Mcp-Session-Id` and `Mcp-Protocol-Version` headers consistently on streamable HTTP responses.","Honor `DELETE` session teardown and return `404` when a deleted session is reused.","Reject invalid protocol-version headers with `400 Bad Request`."],"maintainer_context":null},{"code":"enforce_request_association","severity":"high","title":"Associate roots, sampling, and elicitation with active client requests","why":"Modern MCP guidance expects roots, sampling, and elicitation traffic to be tied to an active client request instead of arriving unsolicited on idle sessions.","action":"Inspect the latest validation evidence and resolve the client-visible regression.","playbook":["Inspect the latest validation evidence.","Resolve the highest-severity client-facing gap first.","Revalidate and confirm the score and verdict improve."],"maintainer_context":null},{"code":"update_protocol_version","severity":"medium","title":"Adopt a current MCP protocol revision","why":"Older protocol revisions reduce compatibility with newer clients and registry programs.","action":"Inspect the latest validation evidence and resolve the client-visible regression.","playbook":["Inspect the latest validation evidence.","Resolve the highest-severity client-facing gap first.","Revalidate and confirm the score and verdict improve."],"maintainer_context":null},{"code":"tighten_step_up_auth","severity":"medium","title":"Document minimal scopes and return cleaner auth challenges","why":"Modern clients expect granular scopes and step-up auth signals such as WWW-Authenticate scope hints.","action":"Return granular scopes and WWW-Authenticate challenge hints instead of forcing overly broad auth upfront.","playbook":["Advertise the narrowest viable scopes in OAuth metadata.","Return `WWW-Authenticate` challenges with scope or insufficient-scope hints when additional consent is needed.","Revalidate with both public discovery and auth-required flows."],"maintainer_context":null},{"code":"respond_validation_stale","severity":"medium","title":"Respond to validation evidence is outside trustops sla","why":"Latest validation is 393.6 hours old, beyond the configured 24h TrustOps alert threshold.","action":"Trigger a fresh validation run or raise scheduler priority when this server must meet the TrustOps alert threshold.","playbook":["Queue a new validation run now.","Inspect whether the scheduler priority should be raised for this server.","Do not treat evidence outside the TrustOps alert threshold as a fresh production decision without review."]},{"code":"repair_session_resume","severity":"medium","title":"Support resumable HTTP sessions cleanly","why":"Modern MCP clients increasingly expect resumable session behavior on streamable HTTP transports.","action":"Inspect the latest validation evidence and resolve the client-visible regression.","playbook":["Inspect the latest validation evidence.","Resolve the highest-severity client-facing gap first.","Revalidate and confirm the score and verdict improve."],"maintainer_context":null}],"publisher_claim":{"verified":false,"status":"unclaimed","claim_url":"https://verify.sentinelsignal.io/claim?server=io.github.getDynamoi%2Fdynamoi&source=report_json","reason_code":"machine_attention_detected","reason":"Agents and crawlers are already evaluating this server. Claim to publish authoritative owner, security, trust, and integration metadata.","score_neutral":true},"observed_attention":{"schema":"verify.observed_attention.v1","window_days":30,"level":"high","label":"High observed attention","summary":"Recent machine-readable trust and discovery activity observed for this server.","segments":{"useful_ai_user":{"level":"none","observed":false,"description":"AI-assisted user sessions such as ChatGPT/User or Claude/User."},"machine_trust_evaluator":{"level":"moderate","observed":true,"description":"Synthetic sessions inspecting multiple trust surfaces such as report, policy, ledger, badge, trust-summary, or compare."},"possible_agent_or_script":{"level":"moderate","observed":true,"description":"Structured direct sessions with rapid profile, compare, report, policy, badge, or trust-surface fan-out."},"isolated_machine_surface":{"level":"moderate","observed":true,"description":"Aged-out direct synthetic singleton sessions that touched a machine-readable trust surface without becoming a broader evaluator."},"ai_crawler":{"level":"moderate","observed":true,"description":"Known AI crawler activity such as ClaudeBot, GPTBot, or similar crawlers."},"search_crawler":{"level":"moderate","observed":true,"description":"Search and SEO crawler activity."},"browser_like_automation":{"level":"none","observed":false,"description":"Browser-like synthetic sessions with rapid structured endpoint activity."},"confirmed_human":{"level":"none","observed":false,"description":"Confirmed browser-session human activity."}},"surfaces_observed":{"server_profile":true,"compare":true,"compare_json":false,"compare_api":true,"report_json":false,"policy":true,"ledger":true,"badge_metadata":true,"badge_svg":true,"trust_summary":true,"mcp_tool":false},"claim_prompt":{"recommended":true,"reason":"This server has recent machine attention. A verified publisher claim can improve owner, policy, security, and trust metadata available to agents."},"notes":["Observed attention is based on segmented first-party telemetry.","Crawler and evaluator activity is not treated as confirmed human demand.","Public levels are bucketed to avoid exposing raw traffic counts."]},"owner_activation":{"claim_recommended":true,"reason":"ai_discovery_detected","headline":"AI discovery detected","message":"This server is being discovered by AI users, crawlers, or machine trust evaluators on Verify. Claim this profile to add publisher metadata, official links, a security contact, and machine-readable trust details agents can use.","claim_url":"https://verify.sentinelsignal.io/claim?server=io.github.getDynamoi%2Fdynamoi&source=report_json","trust_summary_url":"https://verify.sentinelsignal.io/v1/servers/io.github.getDynamoi/dynamoi/trust-summary"},"related_machine_surfaces":{"compare_index":"/compare.json","compare_api":"/v1/compare?server=io.github.getDynamoi%2Fdynamoi","trust_summary":"/v1/servers/io.github.getDynamoi/dynamoi/trust-summary","ledger":"/v1/servers/io.github.getDynamoi/dynamoi/ledger","policy":"/v1/servers/io.github.getDynamoi/dynamoi/policy","report":"/v1/servers/io.github.getDynamoi/dynamoi/report"},"intelligence_api":{"available":true,"signup_url":"https://verify.sentinelsignal.io/verify-intelligence-api","use_case":"Programmatic MCP server trust, comparison, policy, and evidence enrichment."}}