{"version":"v1","generated_at":"2026-07-02T07:57:11.202Z","server_version":"2.4.0","tools":[{"name":"curaition_absence_scan","title":"Absence Scan","description":"Monitor the negative space—find who's gone quiet and why it matters.\n\nWHEN TO USE: \"who's gone quiet?\", \"what's missing?\", contrarian analysis, disruption signals, competitive intelligence. Silence often precedes change.\n\nRETURNS: { notable_absences: [{ entity_name, entity_type, absence_type, decline_rate, baseline_mentions, recent_mentions, domain, last_seen }], scan_metadata: { baseline_window, recent_window, domains_scanned } }\n\nKEY PARAMETERS:\n- domain: Focus on a specific domain (omit for balanced cross-domain scan)\n- min_decline_rate: Minimum decline threshold 0-1 (default: 0.5 = 50% drop)\n- baseline_window: Historical comparison period (default: '90d')\n- recent_window: Recent period to check (default: '14d')\n- Absence types: declining_incumbent, missing_expected, silent_stakeholder, stalled_narrative, platform_exile\n\nPAIRS WELL WITH: curaition_trend_analysis (compare absences vs rising entities), curaition_why_now_analysis (why entities went quiet), curaition_registry (track absences over time), curaition_get_entity_context (mode='cooccurrence' — who replaced absent entities).\n\nExamples:\n  - \"Who's gone quiet in crypto?\" -> domain='crypto'\n  - \"Major absences in F1\" -> domain='f1', min_decline_rate=0.7","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"domain":{"type":"string","maxLength":50,"description":"Filter by content domain"},"expected_entities":{"type":"array","items":{"type":"string","maxLength":255},"description":"Specific entities to check for absence"},"baseline_window":{"type":"string","enum":["30d","60d","90d","180d"],"default":"90d","description":"Baseline period for historical comparison"},"recent_window":{"type":"string","enum":["7d","14d","30d"],"default":"14d","description":"Recent period to compare against baseline"},"min_decline_rate":{"type":"number","minimum":0,"maximum":1,"default":0.5,"description":"Minimum decline rate to flag (0-1, default: 0.5 = 50% decline)"},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum absences to return (1-50, default: 20)"},"mature_sources_only":{"type":"boolean","description":"When true, restrict baseline/recent windows to sources that have content predating the analysis window (content-age maturity), so momentum reflects real change rather than ingestion onboarding. Recommended when an externally-publishable answer is needed."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_asset_catalog","title":"Asset Catalog","description":"Produced asset catalog for content activation outputs (carousels, threads, newsletter sections).\n\nAssets are created from CurAItion intelligence data with full provenance tracking.\nEach asset has ordered slides with overlay copy and media, plus data lineage records.\n\nAsset types: instagram_carousel, twitter_thread, newsletter_section\nStatuses: draft → media_processing → review → approved → published → archived\n\nActions: create, get, update, list, archive, rehost_media, generate_backfill, extract_frames, task_status, upload_frames, analyze_frames, suggest_frame_assignment\n\nFrame actions (hybrid carousel pipeline):\n- extract_frames: Extract video frames at specific timestamps from YouTube videos, Instagram reels, or TikTok videos (async, returns task_id). Pass source_content_id + timestamps array.\n- task_status: Poll for async task completion. Pass task_id from extract_frames or rehost_media. Returns status + result (S3 URLs when complete).\n- upload_frames: Re-host frame URLs to S3 (pass frame_urls + optional source_content_id)\n- analyze_frames: Gemini vision analysis of frames for carousel suitability (pass frames array + optional source_content_id)\n- suggest_frame_assignment: Match analyzed frames to slide positions (pass frame_analyses + slide_functions)\n\nNote: Results are scoped to your organization.","deprecated":false,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["create","get","update","list","archive","rehost_media","generate_backfill","upload_frames","analyze_frames","suggest_frame_assignment","extract_frames","task_status"],"description":"CRUD action. 'archive' soft-deletes. 'rehost_media' dispatches S3 re-hosting. 'generate_backfill' generates Replicate images. 'upload_frames' re-hosts frame URLs to S3. 'analyze_frames' runs Gemini vision analysis on frames. 'suggest_frame_assignment' assigns frames to carousel slide positions. 'extract_frames' extracts video frames from YouTube, Instagram reels, or TikTok videos at specific timestamps (async, returns task_id). 'task_status' polls for async task completion (pass task_id from extract_frames or rehost_media)."},"item_id":{"type":"string","format":"uuid","description":"Asset UUID (required for get/update/archive/rehost_media)"},"item_data":{"description":"Asset definition object (required for create, optional for update). See AssetDataSchema."},"filters":{"description":"Filter criteria for list action. See AssetFilterSchema."},"slide_positions":{"type":"array","items":{"type":"integer","minimum":1},"description":"Slide positions for generate_backfill action (1-based)"},"model":{"type":"string","maxLength":255,"description":"Replicate model ID for generate_backfill (default: black-forest-labs/flux-schnell)"},"frame_urls":{"type":"array","items":{"type":"string","format":"uri"},"maxItems":20,"description":"Frame URLs to re-host to S3 (for upload_frames action)"},"frame_timestamps":{"type":"array","items":{"type":"number"},"description":"Timestamp in seconds for each frame (parallel array to frame_urls)"},"frames":{"type":"array","items":{"type":"object","properties":{"s3_url":{"type":"string","format":"uri","description":"Frame image URL (S3, CDN, or any HTTP)"},"timestamp_seconds":{"type":"number","description":"Video timestamp in seconds"},"citation_context":{"type":"object","additionalProperties":{},"description":"Optional citation context for grounding"}},"required":["s3_url"],"additionalProperties":false},"maxItems":20,"description":"Frames to analyze with Gemini vision (for analyze_frames action)"},"source_content_id":{"type":"string","format":"uuid","description":"Source content UUID for intelligence grounding (analyze_frames) or frame S3 prefix (upload_frames)"},"frame_analyses":{"type":"array","items":{"type":"object","additionalProperties":{}},"description":"Frame analysis results from analyze_frames (for suggest_frame_assignment action)"},"slide_functions":{"type":"array","items":{"type":"string"},"description":"Slide functions: HOOK, CONTEXT, PIVOT, ESCALATION, CLIMAX, LEGACY, CLOSE, CTA"},"timestamps":{"type":"array","items":{"type":"integer","minimum":0},"maxItems":50,"description":"Timestamps in seconds to extract frames at (for extract_frames action, max 50)"},"extraction_strategy":{"type":"string","enum":["auto","ytdlp","storyboard","transcript_replicate"],"description":"Frame extraction strategy (default: auto). 'ytdlp' = yt-dlp+ffmpeg, 'storyboard' = YouTube thumbnail sprites, 'transcript_replicate' = generate from [VISUAL] transcript descriptions via Replicate."},"crop_portrait":{"type":"boolean","description":"Crop extracted frames to 9:16 portrait (default: true)"},"visual_descriptions":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional mapping of timestamp seconds to [VISUAL] descriptions for transcript_replicate strategy. Skips transcript DB lookup when provided."},"aspect_ratio":{"type":"string","maxLength":10,"description":"Target aspect ratio (e.g., '9:16', '4:5', '1:1'). Used by generate_backfill and extract_frames."},"task_id":{"type":"string","description":"Celery task ID to check status of (for task_status action — returned by extract_frames and rehost_media)"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Maximum items to return (1-100, default: 20)"},"offset":{"type":"integer","minimum":0,"default":0,"description":"Number of items to skip for pagination"},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"},"response_detail":{"type":"string","enum":["compact","full"],"default":"full","description":"'compact' returns id/name/type/status/confidence/timestamps per list item (use the 'get' action for full detail). Only affects the 'list' action with response_format='json'."}},"required":["action"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"curaition_batch_resolve_links","title":"Batch Resolve Links","description":"Batch-resolve entity names to owned profiles and mentioning sources.\n\nVALUE: One call returns a complete LINK_REGISTRY for digest production. Eliminates all guessed URLs.\n\nEach resolved entity carries TWO ARRAYS:\n• owned_profiles[] — sources the entity OWNS: an input_sources row whose name exactly matches the entity name or one of its aliases (case-insensitive exact match, never substring). This is the strongest available ownership signal — use it to get a creator's own channel/account.\n• mentioning_sources[] — publishers of content that MENTIONS the entity. These are NOT ownership claims; a news outlet that covers Bitcoin is not owned by Bitcoin.\n\nUSE CASES:\n- \"Resolve all athlete profiles for the Partner Pulse roster\"\n- \"Get source handles for Market Pulse teardowns\"\n\nRETURNS: Complete registry keyed by entity name, primary source selection, and unresolved list for WebSearch fallback.\n\nPAIRS WELL WITH: curaition_resolve_entity_profiles (single-entity deep dive), curaition_search_entities (discover entity names first).","deprecated":false,"input_schema":{"type":"object","properties":{"entity_names":{"type":"array","items":{"type":"string","minLength":1},"minItems":1,"maxItems":50,"description":"Entity names to resolve (e.g., ['Chris Williamson', 'Whitney Simmons', 'DFYNE'])"},"entity_type":{"type":"string","description":"Filter all entities to one type, or omit for mixed"},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["entity_names"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_classify_relationship","title":"Classify Entity Relationship","description":"Classify the *kind* of relationship between two entities — founding, ownership, sponsorship, partnership, collaboration, or mere co-mention.\n\nVALUE: curaition_get_entity_context (mode='cooccurrence') tells you two entities appear together, but not *why*. Whitney Simmons ↔ Alive App co-occurs 20+ times in content — this tool tells you Whitney FOUNDED Alive, not SPONSORED by it. Cache-backed so known pairs don't burn LLM spend on repeat calls.\n\nUSE THIS WHEN: before claiming \"X is sponsored by Y\" or \"X partnered with Y\" editorially, when cooccurrence pairs look meaningful but the nature is ambiguous, when surfacing relationship claims in a newsletter.\n\nPAIRS WELL WITH: curaition_get_entity_context (mode='cooccurrence' to find candidate pairs, mode='relationships' to view all stored typed relationships for an entity), curaition_resolve_entity_profiles (verify the entities first).\n\nReturns typed classification (owns / founded / sponsored_by / partnered_with / collaborates_with / adjacent / unknown), direction, confidence, and evidence.\n\nExamples:\n  - \"Is Whitney Simmons sponsored by Alive App?\" → entity_a='Whitney Simmons', entity_b='Alive App'\n  - \"How is Bitcoin related to MicroStrategy?\" → entity_a='Bitcoin', entity_b='MicroStrategy'","deprecated":false,"input_schema":{"type":"object","properties":{"entity_a":{"type":"string","minLength":1,"description":"First entity — canonical name, alias, or canonical_entity_id UUID"},"entity_b":{"type":"string","minLength":1,"description":"Second entity — canonical name, alias, or canonical_entity_id UUID"},"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"evidence_cap":{"type":"integer","minimum":1,"maximum":10,"default":5,"description":"Maximum supporting evidence items to include (1-10, default 5)"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["entity_a","entity_b"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_compare","title":"Compare Two Projects","description":"Compare two projects on a given dimension — which themes over/under-index in one relative to the other.\n\nVALUE: Single call that answers \"what does our owned channel emphasise vs our partner ecosystem?\" (and vice versa). Statistically grounded: log-odds-ratio with Agresti smoothing + z-score significance.\n\nWHEN TO USE: own-channel audits, competitive gap analysis, theme-positioning diffs between any two projects in the same org.\n\nDIMENSIONS (today): 'themes' only. 'entities', 'formats', 'engagement' reserved for follow-ups.\n\nRETURNS: { dimension, shared: [...], only_in_a: [...], only_in_b: [...], significance_method: 'log-odds-ratio', metadata }. Each theme in shared/only_in_* carries { count_a, count_b, log_odds_ratio, z_score, direction }.\n\nKEY PARAMETERS:\n- project_id_a: the focal project (the one you're auditing)\n- project_id_b: the reference project (what you're comparing against)\n- min_significance: |z| threshold, default 1.96 (95% CI). Lower to 1.28 (80% CI) for more inclusive results.\n- min_weight: theme weight floor, default 0.3. Lower for short-form content (0.1).\n\nExamples:\n  - \"Audit our own channels vs the ecosystem\" -> project_id_a=<owned_channels>, project_id_b=<partner_ecosystem>\n  - \"What does Gymshark emphasise that lululemon doesn't?\" -> project_id_a=<gymshark>, project_id_b=<lululemon>, min_significance=1.28","deprecated":false,"input_schema":{"type":"object","properties":{"dimension":{"type":"string","enum":["themes","entities","formats","engagement"],"default":"themes"},"project_id_a":{"type":"string","minLength":1,"description":"Project ID for scope A — the 'focal' scope in the comparison."},"project_id_b":{"type":"string","minLength":1,"description":"Project ID for scope B — the 'reference' scope. Themes over-indexing in A vs B are the primary signal."},"source_scope_a":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"source_scope_b":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"created_after":{"type":"string","description":"Inclusive lower bound. ISO-8601 timestamp or date (e.g. '2026-04-10T00:00:00Z' or '2026-04-10'). Bare dates are interpreted in the `tz` timezone (default UTC). Filters on `time_field`."},"created_before":{"type":"string","description":"Exclusive upper bound. ISO-8601 timestamp or date. Bare dates are interpreted in `tz`. Filters on `time_field`."},"tz":{"type":"string","default":"UTC","description":"IANA timezone applied when interpreting bare dates in `created_after`/`created_before` (e.g. 'America/New_York', 'Europe/London'). Defaults to UTC."},"time_field":{"type":"string","enum":["source_published_at","ingested_at"],"default":"source_published_at","description":"Which timestamp `created_after`/`created_before` apply to. 'source_published_at' (default) = when the post went live on the source platform — use for 'last N days of posts'. 'ingested_at' = when CurAItion processed it — use for ops/debugging ('what landed in the pipeline today')."},"min_significance":{"type":"number","minimum":0,"default":1.96,"description":"Minimum |z-score| for inclusion. 1.96 ≈ 95% CI; lower to 1.28 for 80% CI (more inclusive, noisier); raise to 2.58 for 99% CI."},"min_weight":{"type":"number","minimum":0,"maximum":1,"default":0.3,"description":"Minimum aggregated theme weight to include. Lower for short-form content (0.1); default 0.3 matches get_cited_themes."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Max items per bucket (shared / only_in_a / only_in_b)."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["project_id_a","project_id_b"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_detect_patterns","title":"Detect Cultural Patterns","description":"Detect emerging cultural patterns before they're named—see the future forming.\n\nVALUE: Finds non-obvious entity clusters revealing structural shifts 2-3 weeks before they become obvious.\n\nWHEN TO USE: \"what's emerging?\", \"what patterns do you see?\", strategic investigations, cross-domain analysis.\n\nRETURNS: { patterns: [{ suggested_name, pattern_type, confidence, constituent_entities: [{ entity_name, entity_type, role, contribution_weight }], evidence_summary, domains }], metadata: { time_window, domains_analyzed } }\n\nKEY PARAMETERS:\n- domains: Array of domains to scan (e.g., ['crypto', 'f1']). Omit to scan ALL domains. NOTE: a SINGLE domain is not supported — pattern detection is cross-domain co-occurrence and needs ≥2 domains, so pass two or more, or omit the filter entirely.\n- time_window: '7d', '14d', '30d', '90d' (default: '30d')\n- Pattern types: structural_shift, narrative_emergence, power_rebalancing, technology_substrate, cultural_fatigue, professionalisation\n- Entity roles: driver, accelerant, victim, beneficiary, symptom, interface\n\nPAIRS WELL WITH: curaition_why_now_analysis (explain pattern triggers), curaition_registry (save detected patterns), curaition_implication_map (translate patterns to actions), curaition_trend_analysis (validate with momentum data), curaition_get_cited_themes (evidence for pattern themes).\n\nExamples:\n  - \"Patterns forming in crypto?\" -> domains=['crypto']\n  - \"Cross-domain patterns\" -> time_window='30d'","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"content_type":{"type":"string","enum":["article","video","instagram_reel","instagram_post","instagram_carousel","tiktok_video","tiktok_slideshow"],"description":"Filter by content type (e.g., 'article', 'video', 'instagram_reel', 'tiktok_video')"},"time_window":{"type":"string","enum":["7d","14d","30d","90d"],"default":"30d","description":"Time window for analysis"},"domains":{"type":"array","items":{"type":"string","maxLength":50},"description":"Filter by specific domains (empty = all domains)"},"min_entities":{"type":"integer","minimum":2,"maximum":10,"default":3,"description":"Minimum entities required in a pattern (2-10, default: 3)"},"min_confidence":{"type":"number","minimum":0,"maximum":1,"default":0.6,"description":"Minimum confidence score for detected patterns (0-1, default: 0.6)"},"citation_depth":{"type":"string","enum":["none","summary","full"],"default":"summary","description":"Citation detail level: 'none', 'summary' (default), or 'full'"},"limit":{"type":"integer","minimum":1,"maximum":20,"default":10,"description":"Maximum patterns to return (1-20, default: 10)"},"ranking":{"type":"string","enum":["weighted","raw"],"default":"weighted","description":"SP6 domain-lens ranking, applied by the Python detection API: 'weighted' (default) = per-domain percentile normalization + org-interest weighting for org callers; 'raw' = detector order. Super-admin cross-org sessions (source_scope='all_orgs') always get raw; pass org_id to rank through that org's lens."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_discover","title":"Discover Cultural Intelligence","description":"CRITICAL: This tool returns EVIDENCE from CurAItion's curated database. You MUST present the cited_evidence section FIRST, then summarize. DO NOT supplement, fabricate, or add information beyond what the tool returns.\n\nTWO empty-citation cases — do NOT conflate them:\n- If the tool returns an INSUFFICIENT_CITATIONS error (answer_summary is null), tell the user no evidence was found — do NOT generate your own answer.\n- If answer_summary IS present but cited_evidence is empty (a \"what's new / latest\" digest or a broad live-snapshot — metadata.intent='recent_digest' or metadata.degraded_to_live_snapshot=true), that is a VALID grounded answer: the risers/fallers/gone-quiet movers and emerging patterns ARE the data (structured signals from the database, just not quote-citations). PRESENT IT as the answer. Do NOT call it insufficient, degenerate, or rejected, and do NOT tell the user to narrow their query.\n\nUnified entry point for cultural intelligence queries. Routes natural language questions to appropriate analysis tools and synthesizes results.\n\nRESPONSE FORMAT: Evidence-first. Tool outputs numbered citations [1], [2], [3] BEFORE the summary. Summary contains inline refs like \"Based on analysis [1-3], entity X [2] shows...\". Present evidence section first in your response.\n\nWHEN TO USE: Starting investigations, broad questions (\"what's trending?\", \"why is X hot?\"), need synthesized answers from multiple tools.\n\nTOOL SELECTION:\n- Research question spanning multiple angles? → curaition_discover (this tool)\n- Find content by entity/creator name? → curaition_list_content (search param, fastest)\n- Search by concept/meaning? → curaition_semantic_search\n- Browse/filter by domain, type, date? → curaition_list_content\n- Full details for a known item? → curaition_get_content (by ID/slug)\n\nENTITY INVESTIGATION PLAYBOOK (recommended sequence for named entity queries):\n1. curaition_list_content(search='<entity>') — find all content (fastest, no embedding)\n2. curaition_trend_analysis(domain='<domain>') — check momentum score\n3. curaition_get_entity_context(entity_name='<entity>', mode='cooccurrence') — map entity network\n4. curaition_get_cited_themes(content_id='<id>') — evidence chains from specific content\n5. curaition_why_now_analysis(entity_name='<entity>') — explain timing if trending\n\nKEY PARAMETERS (most calls only need query — and optionally organization/domain):\n- query: Natural language question (3-500 chars). The only always-needed param.\n- organization: Pass the company/brand name when the user asks about a specific org (e.g., 'Gymshark', 'Culture Defined'). Auto-resolves to org-scoped results.\n- domain: Focus area (e.g., 'crypto', 'f1'). Omit to scan across domains.\n- mode: THE MASTER KNOB. 'investigate' (default) = evidence-first over the user's OWN sources; it FORCES my_sources + require_citations and IGNORES depth/citation_depth/source_scope/require_citations, so don't bother setting those. 'explore' = permissive scan across ALL sources (the whole market), and only then do the other knobs take effect. Default to 'investigate'; use 'explore' only for broad market/landscape questions.\n- depth: 'quick' (1 tool), 'standard' (2-3, default), 'deep' (4+). [No effect in investigate mode.]\n- citation_depth: HOW MUCH evidence — 'none'/'summary' (default)/'full'. [No effect in investigate mode.] NOT the same as citation_mode.\n- citation_mode: HOW evidence is PRESENTED — 'strict' (default, evidence-first)/'flexible' (legacy). Rarely needs changing.\n- require_citations: fail-closed when true (default). [No effect in investigate mode; switch to 'explore' to relax.]\n\nWHEN UNSURE, ASK — DON'T GUESS: if it's materially ambiguous whether the user means their OWN sources vs the whole MARKET (investigate vs explore), which organization, or which time_window, ask one short clarifying question before calling. A wrong scope returns confidently-wrong results. The advanced knobs above have safe defaults — leave them unset unless the user explicitly asked for that behaviour.\n\nRETURNS: cited_evidence (with numbered refs [1], [2]), answer_summary (with inline refs), related_entities, actionable_insights, citation_diagnostics\n\nROUTES TO: trend_analysis, detect_patterns, entity_cooccurrence, why_now_analysis, absence_scan, implication_map, semantic_search, get_cited_themes","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"mode":{"type":"string","enum":["investigate","explore"],"default":"investigate","description":"'investigate' (default) or 'explore'. Investigate locks strict evidence settings (forces my_sources + require_citations and ignores depth/citation_depth/source_scope/require_citations); explore uses permissive defaults and honours those knobs. Leave at default unless the user wants the whole market — then use 'explore'."},"query":{"type":"string","minLength":3,"maxLength":500,"description":"Natural language question about cultural trends, patterns, or entities"},"organization":{"type":"string","maxLength":100,"description":"Organization or brand name to scope results to (e.g., 'Gymshark', 'Culture Defined'). When provided, results are automatically scoped to this organization's content."},"domain":{"type":"string","maxLength":50,"description":"Focus on specific domain (e.g., 'crypto', 'f1')"},"time_window":{"type":"string","enum":["7d","14d","30d","90d"],"default":"30d","description":"Time window for analysis (default: '30d')"},"depth":{"type":"string","enum":["quick","standard","deep"],"default":"standard","description":"How thorough to be: quick, standard (default), or deep"},"citation_depth":{"type":"string","enum":["none","summary","full"],"default":"summary","description":"HOW MUCH citation evidence to gather: 'none', 'summary' (default, 1-2 key quotes), or 'full' (forces the citation tool, all quotes). NOTE: this is about quantity of evidence — it is NOT the same as citation_mode, which controls ordering. Ignored in 'investigate' mode (locked to 'summary')."},"require_citations":{"type":"boolean","default":true,"description":"When true (default), returns INSUFFICIENT_CITATIONS error rather than an uncited answer. Set false only for exploratory queries where an empty-citation answer is acceptable. Ignored in 'investigate' mode (locked to true) — to relax it you must also switch mode to 'explore'."},"citation_mode":{"type":"string","enum":["flexible","strict"],"default":"strict","description":"HOW citations are PRESENTED (ordering, not quantity — contrast citation_depth): 'strict' (default) renders evidence first with inline refs [1][2]; 'flexible' is the legacy summary-first layout. You rarely need to change this; leave it at 'strict'."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"curaition_events_in_content","title":"Calendar Events Mentioned in Content","description":"Given a content_id, return calendar events that share at least one canonical_entity with the content (via the content_entities ↔ calendar_event_entities bridge).\n\nWHEN TO USE:\n- Looking at a video / article / post and want to know \"what curated event is this content about\"\n- Building event-driven analysis: trace content back to the event(s) it covers\n- Confirming whether a piece of content was published in proximity to a known event\n\nRETURNS: [{ event_id, name, slug, domain, event_type, start_date, end_date, location, significance, role, confidence, via_entity }]\n\nThe `via_entity` field tells you which canonical_entity made the link — useful when content tangentially mentions an event entity. `confidence` reflects the strength of the calendar_events ↔ canonical_entities bridge (from the CUR-542 backfill).\n\nEMPTY RESULT: An empty array means either (a) no content_entities for this content link to any calendar_events bridge row, or (b) the content_id doesn't exist. The two cases are not distinguished — confirm the content_id with curaition_get_content if needed.\n\nPAIRS WELL WITH: curaition_get_content (full content detail), curaition_get_event_by_slug (drill into a returned event).\n\nExamples:\n  - \"What events does this F1 race recap cover?\" → content_id='<uuid>'","deprecated":false,"input_schema":{"type":"object","properties":{"content_id":{"type":"string","format":"uuid","description":"UUID of the content. Returns calendar events that share at least one canonical_entity with this content (via the content_entities ↔ calendar_event_entities bridge)."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["content_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_feedback","title":"Record Pattern or Content Feedback","description":"Record a verdict (helpful / not_helpful / inaccurate / stale) on a pattern or content item the agent just used.\n\nWHEN TO USE: After surfacing a pattern or content item to the end user, capture whether it was actually useful. This is the agent-side analogue of the portal thumbs button — the platform uses these verdicts to calibrate pattern gating thresholds, dedup, and lifecycle decisions.\n\nINPUT (exactly one target):\n- Set EITHER pattern_id OR content_id (both = error; neither = error)\n- feedback_type: 'helpful' | 'not_helpful' | 'inaccurate' | 'stale'\n- comment (optional, ≤500 chars): brief reason for the verdict\n- agent_session_id (optional): for chaining verdicts within a session\n\nRETURNS: { feedback_id, recorded_at }\n\nEXAMPLES:\n- After curaition_get_pattern_history landed a useful narrative: pattern_id='...', feedback_type='helpful'\n- After a content item turned out to be stale: content_id='...', feedback_type='stale', comment='post is 6 months old'\n- After a pattern's claim didn't match reality: pattern_id='...', feedback_type='inaccurate'\n\nCounts against your org's daily \"write\" rate budget (hobby: 20, starter: 50, pro: 150, enterprise: unlimited).","deprecated":false,"input_schema":{"type":"object","properties":{"pattern_id":{"type":"string","format":"uuid","description":"Pattern UUID. Set this OR content_id, not both."},"content_id":{"type":"string","format":"uuid","description":"Content UUID. Set this OR pattern_id, not both."},"feedback_type":{"type":"string","enum":["helpful","not_helpful","inaccurate","stale"],"description":"Verdict on the cited pattern or content. Mirrors the 4 portal-button verdicts."},"comment":{"type":"string","maxLength":500,"description":"Optional free-text comment (≤500 chars). Use to explain why a verdict was chosen."},"agent_session_id":{"type":"string","description":"Optional MCP session id. Future CUR-682 plumbing will populate this automatically from the Mcp-Session-Id header — until then, agents may pass it explicitly to chain feedback to a session."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["feedback_type"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"curaition_get_analysis","title":"Get Content Analysis","description":"Retrieve content analysis results by type (outline or crypto_signal).\n\nWHEN TO USE: Need structured analysis data (outlines, signal strength, themes) rather than raw content. Use 'topic' to filter by keywords across themes, titles, and analysis data.\n\nRETURNS: { analyses: [{ content_id, title, analysis_type, confidence_score, model_used, themes, signal_strength (crypto_signal only), created_at }], count, has_more }\n\nKEY PARAMETERS:\n- analysis_type: 'outline' (comprehensive structure analysis) or 'crypto_signal' (market signal analysis)\n- topic: Keyword filter across themes, title, analysis data (e.g., topic='AI')\n- min_confidence: Minimum confidence score (0-1)\n\nPAIRS WELL WITH: curaition_get_content (full content for an analysis result), curaition_get_cited_themes (evidence chains for themes found in analysis), curaition_detect_patterns (patterns across analyzed content).\n\nExamples:\n  - \"Show content outlines\" -> analysis_type='outline'\n  - \"Get crypto signals\" -> analysis_type='crypto_signal', domain='crypto'\n  - \"Find AI-related outlines\" -> analysis_type='outline', topic='AI'\n  - \"High-confidence Bitcoin outlines\" -> analysis_type='outline', topic='Bitcoin', min_confidence=0.8","deprecated":false,"input_schema":{"type":"object","properties":{"analysis_type":{"type":"string","description":"Type of analysis to retrieve (e.g., 'outline', 'crypto_signal')"},"domain":{"type":"string","description":"Filter by content domain (e.g., 'crypto', 'f1', 'tech')"},"topic":{"type":"string","maxLength":200,"description":"Filter by topic/keyword — searches content title, analysis title, and theme names/descriptions"},"min_confidence":{"type":"number","minimum":0,"maximum":1,"default":0,"description":"Minimum confidence score (0-1)"},"min_quality_score":{"type":"number","minimum":0,"maximum":1,"description":"Minimum content quality score (0-1). Filters out promotional/low-quality content. Recommended: 0.5"},"include_citations":{"type":"boolean","default":false,"description":"Include citation data from analysis_data JSONB"},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Maximum results to return (1-100, default: 20)"},"offset":{"type":"integer","minimum":0,"default":0,"description":"Number of results to skip for pagination"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["analysis_type"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_calibration","title":"Get Calibration (super-admin)","description":"[SUPER-ADMIN] Earned-confidence report: per-tool precision @30/60/90d for backtested directional claims, plus pattern-feedback tallies. Read-only.","deprecated":false,"input_schema":{"type":"object","properties":{"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_cited_themes","title":"Get Cited Themes","description":"Retrieve themes with full citation chains, evidence quotes, and YouTube timestamp deep links.\n\nWHEN TO USE: \"show me evidence\", \"prove it\", grounding patterns/trends in specific citations, extracting themes from content. This is the primary evidence-sourcing tool.\n\nRETURNS: { themes: [{ theme, description, weight, citations: [{ quote, timestamp, timestamp_seconds, timestamp_url }], content_title, content_id }], count }\n\nKEY PARAMETERS:\n- theme_query: Fuzzy-match a specific theme (e.g., \"regulation\")\n- content_id: Filter to a single content item\n- aggregate: true to combine same themes across multiple items\n- min_weight: Lower for short-form content (default: 0.3)\n\nPAIRS WELL WITH: curaition_detect_patterns (evidence for patterns), curaition_trend_analysis (citations for trends), curaition_why_now_analysis (validate trigger hypotheses), curaition_semantic_search (find content then extract themes).\n\nExamples:\n  - \"Regulation themes across videos\" -> aggregate=true, theme_query=\"regulation\"\n  - \"Themes from this video\" -> content_id=<uuid>","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"theme_query":{"type":"string","maxLength":200,"description":"Search for specific theme (fuzzy match)"},"content_id":{"type":"string","format":"uuid","description":"Filter to single content item"},"domain":{"type":"string","description":"Filter by domain name"},"min_weight":{"type":"number","minimum":0,"maximum":1,"default":0.3,"description":"Minimum theme weight (0-1, default: 0.3). Lower values return more themes from short-form content."},"aggregate":{"type":"boolean","default":false,"description":"Aggregate same themes across multiple content items"},"limit":{"type":"integer","minimum":1,"maximum":50,"default":10,"description":"Maximum results to return (1-50, default: 10)"},"created_after":{"type":"string","description":"Inclusive lower bound. ISO-8601 timestamp or date (e.g. '2026-04-10T00:00:00Z' or '2026-04-10'). Bare dates are interpreted in the `tz` timezone (default UTC). Filters on `time_field`."},"created_before":{"type":"string","description":"Exclusive upper bound. ISO-8601 timestamp or date. Bare dates are interpreted in `tz`. Filters on `time_field`."},"tz":{"type":"string","default":"UTC","description":"IANA timezone applied when interpreting bare dates in `created_after`/`created_before` (e.g. 'America/New_York', 'Europe/London'). Defaults to UTC."},"time_field":{"type":"string","enum":["source_published_at","ingested_at"],"default":"source_published_at","description":"Which timestamp `created_after`/`created_before` apply to. 'source_published_at' (default) = when the post went live on the source platform — use for 'last N days of posts'. 'ingested_at' = when CurAItion processed it — use for ops/debugging ('what landed in the pipeline today')."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_content","title":"Get Content Details","description":"Get full details for a specific content item by content_id (UUID) or slug.\n\nWHEN TO USE: After finding items via curaition_list_content or curaition_semantic_search, drill into one item for full details and citations.\n\nRETURNS: { content_id, title, url, content_type, format, format_metadata, domain_name, status, quality_score, engagement, sentiment_intent, entities: [{ entity_name, entity_type }], analyses: [{ analysis_type, confidence_score }], citations (if include_citations=true): [{ theme, quote, timestamp, timestamp_url }] }\n\nFORMAT FIELD (CUR-428): 'format' is the normalised taxonomy value (instagram_reel / instagram_post / instagram_carousel / tiktok_video / tiktok_slideshow / youtube_short / youtube_long / article); 'format_metadata' = { duration_seconds, asset_count, aspect_ratio }.\n\nENGAGEMENT FIELD (CUR-402): { platform, captured_at, likes, views, saves, shares, comments, watch_time_seconds, normalised_score }. TikTok digg→likes, play→views, collect→saves. Instagram plays_count (reels) or views_count (static)→views, saves_count→saves. YouTube reads video_engagement_snapshots when available, else live videos-table values (captured_at=null signals live fallback). Articles/newsletters → engagement=null.\n\nSENTIMENT + INTENT (CUR-411): sentiment_intent = { sentiment_score (-1..1), sentiment_confidence, sentiment_method, intent_class, intent_confidence, register, comment_tone_summary, classified_at } when classified; null otherwise.\n\nPAIRS WELL WITH: curaition_list_content (find items first), curaition_semantic_search (find items first), curaition_get_cited_themes (themes across multiple items), curaition_get_analysis (analysis details by type).\n\nSet include_citations=true for evidence-backed citations with YouTube timestamp deep links. Either content_id (or id) or slug must be provided.\n\nExamples:\n  - \"Show me details for content abc-123\" -> content_id='abc-123'\n  - \"Show details with citations\" -> include_citations=true","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"content_id":{"type":"string","format":"uuid","description":"Content UUID (use either content_id or slug)"},"id":{"type":"string","format":"uuid","description":"Alias for content_id — accepts either parameter name"},"slug":{"type":"string","maxLength":300,"description":"Content slug (use either content_id or slug)"},"include_citations":{"type":"boolean","default":false,"description":"Include citation data with YouTube timestamp links for themes and cultural references"},"include_embed_html":{"type":"boolean","default":false,"description":"Include pre-formatted embed HTML (Instagram iframe, TikTok blockquote, YouTube card) for rendering in newsletters"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_entity_context","title":"Get Entity Context","description":"Unified entity-context lookup — returns either the typed relationship graph (CUR-399) OR implicit co-occurrence, selected by the 'mode' flag.\n\nWHEN TO USE: \"who is X connected to?\", \"who founded X?\", stakeholder maps, influence networks, competitive positioning, narrative context mapping.\n\nTWO MODES:\n- mode='relationships' (default) — returns CUR-399 typed graph when typed filters (relationship_type / method / min_confidence / …) are present; otherwise legacy content_relationships co-occurrence. Output shape: { entity, mode, relationships }.\n- mode='cooccurrence' — returns implicit \"who appears with whom\" derived from content_entities, including next_steps. Output shape: { entity, cooccurrences, next_steps }.\n\nTYPED-GRAPH COVERAGE CAVEAT (mode='relationships' with typed filters):\nThe entity_relationships table covers <1% of canonical entities today — most\ntyped-graph queries will return empty. An empty result means \"we don't have a\ntyped edge for this entity\", NOT \"the entity has no relationships.\" Always\nfall back to mode='cooccurrence' or 'method=nlp_inference' when typed coverage\nis missing.\n\nTYPED RELATIONSHIP VOCABULARY (mode='relationships'):\n- OWNS / FOUNDED — permanent person→org/product/app facts\n- SPONSORED_BY — time-boxed brand deals (expires_at set)\n- COLLABORATES_WITH — joint projects/capsules (time-boxed)\n- APPEARS_WITH — fallback co-occurrence when nothing stronger is known\n\nMETHODS (mode='relationships'):\n- websearch — operator-curated via scheduled WebSearch backfill (has source_url, ~highest trust)\n- manual — operator-entered\n- nlp_inference — extracted from content (lowest trust; the dominant method today)\n\nPAIRS WELL WITH: curaition_classify_relationship (distinguish ownership vs sponsorship vs co-mention), curaition_trend_analysis, curaition_why_now_analysis.\n\nExamples:\n  - \"Who founded Alive App?\" -> entity_name='Alive App', mode='relationships', relationship_type='FOUNDED'\n  - \"Who appears with Bitcoin?\" -> entity_name='Bitcoin', mode='cooccurrence'\n  - \"Brands with McLaren?\" -> entity_name='McLaren', mode='cooccurrence', entity_type='brand'\n  - \"Show Whitney Simmons's current brand deals\" -> entity_name='Whitney Simmons', mode='relationships', relationship_type='SPONSORED_BY'","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"mode":{"type":"string","enum":["relationships","cooccurrence"],"default":"relationships","description":"Which edge-weighting to return: 'relationships' (CUR-399 verified graph or legacy content_relationships co-occurrence) or 'cooccurrence' (implicit 'who appears with whom' derived from content_entities)."},"entity_name":{"type":"string","minLength":1,"maxLength":200,"description":"Name of the entity to find context for"},"entity_type":{"type":"string","description":"Filter by entity type (e.g., 'person', 'organization', 'brand'). Applied in cooccurrence mode."},"domain":{"type":"string","maxLength":50,"description":"Filter to a specific domain (e.g., 'crypto', 'f1'). In cooccurrence mode, omitting yields a balanced cross-domain view."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Maximum results to return (1-100, default: 20)"},"created_after":{"type":"string","description":"Inclusive lower bound. ISO-8601 timestamp or date (e.g. '2026-04-10T00:00:00Z' or '2026-04-10'). Bare dates are interpreted in the `tz` timezone (default UTC). Filters on `time_field`."},"created_before":{"type":"string","description":"Exclusive upper bound. ISO-8601 timestamp or date. Bare dates are interpreted in `tz`. Filters on `time_field`."},"tz":{"type":"string","default":"UTC","description":"IANA timezone applied when interpreting bare dates in `created_after`/`created_before` (e.g. 'America/New_York', 'Europe/London'). Defaults to UTC."},"time_field":{"type":"string","enum":["source_published_at","ingested_at"],"default":"source_published_at","description":"Which timestamp `created_after`/`created_before` apply to. 'source_published_at' (default) = when the post went live on the source platform — use for 'last N days of posts'. 'ingested_at' = when CurAItion processed it — use for ops/debugging ('what landed in the pipeline today')."},"relationship_type":{"type":"string","enum":["OWNS","FOUNDED","SPONSORED_BY","COLLABORATES_WITH","APPEARS_WITH"],"description":"Typed relationship filter (CUR-399). Relationships mode only."},"relationship_types":{"type":"array","items":{"type":"string","enum":["OWNS","FOUNDED","SPONSORED_BY","COLLABORATES_WITH","APPEARS_WITH"]},"description":"Multiple typed relationship filters — OR'd together. Relationships mode only."},"method":{"type":"string","enum":["websearch","manual","nlp_inference"],"description":"Only return relationships whose method matches (CUR-399). Relationships mode only."},"method_allowlist":{"type":"array","items":{"type":"string","enum":["websearch","manual","nlp_inference"]},"description":"Multi-method allowlist (CUR-399). Relationships mode only."},"min_confidence":{"type":"number","minimum":0,"maximum":1,"description":"Only return typed relationships with confidence >= this (default 0.7 when any typed filter is set). Relationships mode only."},"include_expired":{"type":"boolean","default":false,"description":"Include rows where expires_at <= NOW (CUR-399). Relationships mode only."},"content_type":{"type":"string","enum":["article","video","instagram_reel","instagram_post","instagram_carousel","tiktok_video","tiktok_slideshow"],"description":"Filter by content type (e.g., 'article', 'video', 'instagram_reel', 'tiktok_video')"},"exclude_publishers":{"type":"boolean","default":true,"description":"Exclude publisher/platform entities (news sites, social media). Cooccurrence mode only."},"min_cooccurrences":{"type":"integer","minimum":1,"default":2,"description":"Minimum number of co-occurrences to include. Cooccurrence mode only (default: 2)."},"ranking":{"type":"string","enum":["weighted","raw"],"default":"weighted","description":"SP6 domain-lens ranking for the balanced (no-domain) co-occurrence view: 'weighted' (default) = per-domain percentile normalization + org-interest weighting for org users; 'raw' = legacy count order. Super-admin cross-org sessions (source_scope='all_orgs') always get raw; pass org_id to rank through that org's lens. No effect when 'domain' is set."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["entity_name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_event_by_slug","title":"Get Calendar Event by Slug","description":"Look up a single calendar event by its URL-friendly slug, with all linked canonical_entities and a count of distinct content mentioning the event.\n\nWHEN TO USE:\n- Have a slug from curaition_list_calendar_events results → drill in here\n- Need to know which extracted entities are bridged to a curated event\n- Need a content_count for an event without iterating curaition_list_content\n\nRETURNS: { event: { event_id, name, slug, domain, event_type, start_date, end_date, location, significance, description }, linked_entities: [{ canonical_entity_id, canonical_name, entity_type, role, confidence, appearance_count }], content_count }\n\nLINKAGE: The 'linked_entities' come from `calendar_event_entities`, populated by alembic migration 113_calendar_event_entities (CUR-542). `role` ∈ {primary, venue, organizer, sponsor, mentioned}; `confidence` is the matching score from the backfill (1.0 = exact name, lower = substring/length-ratio).\n\nNULL RESULT: Returns null when no event with that slug exists. Slugs are case-sensitive.\n\nPAIRS WELL WITH: curaition_list_calendar_events (find a slug), curaition_search_entities (with entity_name from linked_entities to see all content mentioning that entity), curaition_list_content (with search='<event name>' to find content mentioning the event).\n\nExamples:\n  - \"Tell me about Paris Fashion Week 2027\" → slug='pfw-spring-2027'\n  - \"Get details for AWS re:Invent 2026\" → slug='aws-reinvent-2026'","deprecated":false,"input_schema":{"type":"object","properties":{"slug":{"type":"string","minLength":1,"description":"URL-friendly event identifier (e.g. 'pfw-spring-2027'). Returns the event row plus any linked canonical_entities and a count of distinct content mentioning them."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["slug"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_health","title":"Get Platform Health","description":"Get temporal health metrics—answer \"is the platform healthy right now?\"\n\nReports last ingestion time, processing failures, embedding coverage, pattern detection activity, and hypothesis generation activity. All scoped to your organization.\n\nUSE THIS WHEN: \"is the platform working?\", \"when was the last ingestion?\", \"any failures?\", debugging pipelines.\n\nExamples:\n  - \"Is the platform healthy?\" -> use this tool\n  - \"Any processing failures?\" -> use this tool","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_ingest_status","title":"Get Ingest Job Status","description":"Poll the status of an on-demand ingest job queued via curaition_queue_source_ingest. Returns the full job row — status, progress %, item counts, cost actuals, and error messages.\n\nUse after queuing a job to follow its progress through the pipeline:\nqueued → apify_running → apify_complete → gemini_running → writing → completed\n\nTerminal states: completed | failed | canceled.\n\nVisibility: super-admins see any job; org members see only jobs their org created (cross-org ids return 404, not 403, so existence isn't leaked).","deprecated":false,"input_schema":{"type":"object","properties":{"job_id":{"type":"string","format":"uuid","description":"Ingest job UUID returned by curaition_queue_source_ingest."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["job_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_pattern_connections","title":"Get Pattern Entity Connections","description":"Typed-directional graph structure of a pattern's constituent entities — who shapes/amplifies/disrupts whom, with strength scores.\n\nVALUE: A pattern's \"constituent entities\" list tells you *who* is involved; this tool tells you *how* they relate. Surfaces 9 directional connection types (amplifies, influences, enables, disrupts, shapes, controls, builds, competes, constrains) plus 1 undirected fallback (co_occurs). Each edge has a strength score in [0, 1] and an optional label.\n\nWHEN TO USE: \"what's the structure of this pattern?\", \"which entity is amplifying which?\", \"show me the strongest links inside this pattern\", network visualization, due-diligence on entity-role claims.\n\nRETURNS: { pattern_id, pattern_name, total_connections, total_available, gated, counts_by_type, connections: [{ id, source_entity_id, source_entity_name, target_entity_id, target_entity_name, connection_type, label, strength, evidence, created_at }] }\n\nKEY PARAMETERS:\n- pattern_id (required): UUID from any pattern listing tool\n- connection_types: filter array (e.g. ['amplifies','disrupts']). Default: all types.\n- min_strength: 0-1 lower bound. While gated the effective floor is max(0.70, min_strength) — you can raise it but not lower it below 0.70. With include_low_confidence=true it applies as-given (default 0).\n- limit: 1-200, default 20, ordered by strength DESC.\n- include_low_confidence (default false): by default only role-derived edges with strength >= 0.70 are shown (top 20). Set true to return the full ungated graph (legacy/unverified + co-occurrence-fallback + low-strength edges) for auditing.\n\nPAIRS WELL WITH: curaition_registry (action='get') for the static pattern detail, curaition_get_pattern_history (velocity time-series), curaition_get_entity_context to dig into one entity's broader graph.","deprecated":false,"input_schema":{"type":"object","properties":{"pattern_id":{"type":"string","format":"uuid","description":"Pattern UUID whose entity connection graph to fetch"},"connection_types":{"type":"array","items":{"type":"string","maxLength":50},"description":"Filter by connection_type values (e.g. ['amplifies','disrupts']). Omit for all types. Valid: amplifies, influences, enables, disrupts, shapes, controls, builds, competes, constrains, co_occurs."},"min_strength":{"type":"number","minimum":0,"maximum":1,"default":0,"description":"Minimum connection strength (0-1, default 0). Use 0.5+ to surface only strongest links."},"limit":{"type":"integer","minimum":1,"maximum":200,"default":20,"description":"Maximum connections to return, ordered by strength DESC (1-200, default 20)"},"include_low_confidence":{"type":"boolean","default":false,"description":"Show ALL connections including unverified (no provenance), low-strength (<0.70), and co-occurrence-fallback edges. Default false surfaces only role-derived edges with strength >= 0.70 (top 20 by strength). Set true for auditing/debugging the full graph."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["pattern_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_pattern_history","title":"Get Pattern Velocity History","description":"Time-series velocity, signal count, confidence, and lifecycle-status snapshots for a single pattern.\n\nVALUE: Lets you see how a pattern accelerated, peaked, and settled over time — not just the current scalar reading. Use this to validate momentum claims, distinguish real shifts from noise, and trace lifecycle transitions.\n\nWHEN TO USE: \"is this pattern actually accelerating?\", \"when did it peak?\", \"show me the trend\", lifecycle audits, momentum evidence-gathering.\n\nRETURNS: { pattern_id, pattern_name, rows: [{ recorded_at, velocity, signal_count, confidence, status }], summary: { total_snapshots, latest_velocity, mean_velocity_7d, peak_velocity, peak_recorded_at, first_signal_count, status_progression } }\n\nKEY PARAMETERS:\n- pattern_id (required): UUID from any pattern listing tool\n- since: ISO-8601 lower bound (omit for full history)\n- limit: 1-500, default 100\n\nPAIRS WELL WITH: curaition_registry (action='get') for the static pattern detail; curaition_why_now_analysis to explain the spikes; curaition_get_pattern_journal for milestone events that align with velocity shifts.","deprecated":false,"input_schema":{"type":"object","properties":{"pattern_id":{"type":"string","format":"uuid","description":"Pattern UUID whose velocity history to fetch"},"since":{"type":"string","format":"date-time","description":"Optional ISO-8601 lower bound. Omit to start from the pattern's first snapshot."},"limit":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Maximum snapshots to return, ordered chronologically (1-500, default 100)"},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["pattern_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_pattern_journal","title":"Get Pattern Lifecycle Journal","description":"Audit trail of lifecycle events for a single pattern — milestone (saved/curated), peak (new velocity peak), transition (status changed), trigger (causal hypothesis attached).\n\nVALUE: Lets you see exactly how a pattern reached its current state — when it was first detected, when it peaked, which transitions it went through, and what causal triggers were attached. Critical for trust-building, due-diligence on momentum claims, and understanding why a pattern's confidence shifted.\n\nWHEN TO USE: \"what's the history of this pattern?\", \"when did it transition to peaking?\", trust audits, lifecycle reviews, evidence-gathering for client briefings.\n\nRETURNS: { pattern_id, pattern_name, total_events, counts_by_type, events: [{ id, event_type, event_subtype, occurred_at, title, description, significance, related_entity_name, metadata }] }\n\nKEY PARAMETERS:\n- pattern_id (required): UUID from any pattern listing tool\n- event_types: filter array (e.g. ['transition','peak']). Default: all types.\n- since: ISO-8601 lower bound on occurred_at\n- limit: 1-200, default 50\n\nPAIRS WELL WITH: curaition_get_pattern_history (velocity time-series — align peaks with journal entries), curaition_registry (action='get') for the static pattern detail, curaition_why_now_analysis to dig into trigger events.","deprecated":false,"input_schema":{"type":"object","properties":{"pattern_id":{"type":"string","format":"uuid","description":"Pattern UUID whose lifecycle journal to fetch"},"event_types":{"type":"array","items":{"type":"string","maxLength":50},"description":"Filter by event_type values (e.g. ['transition','peak']). Omit for all event types."},"since":{"type":"string","format":"date-time","description":"Optional ISO-8601 lower bound on occurred_at. Omit to start from the pattern's earliest event."},"limit":{"type":"integer","minimum":1,"maximum":200,"default":50,"description":"Maximum events to return, ordered most-recent-first (1-200, default 50)"},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["pattern_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_get_stats","title":"Get Database Statistics","description":"Get overview statistics for the CurAItion database.\n\nReturns total counts for content, entities, relationships, and embeddings,\nplus breakdowns by domain and content type.\n\nDOMAIN REGISTRY: the response also includes a 'domain_registry' array — every\nactive domain with its domain_id, domain_name, display_name, description, and\nscoped content_count. Use this to resolve a domain name to its id (e.g. for\nfiltering) without a separate lookup.\n\nNote: Statistics are scoped to content visible to your organization.\n\nExamples:\n  - \"How much content is in the database?\" -> use this tool\n  - \"What domains exist / how many items per domain?\" -> use this tool\n  - \"Give me an overview of the data\" -> use this tool","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_implication_map","title":"Implication Map","description":"Generate audience-specific strategic implications for a pattern or entity — translate signals into action.\n\nUSE THIS WHEN: \"what does this mean?\", \"what should I do?\", \"so what?\", final step of analysis workflows.\n\nAudiences: product (build/integrate), brand (positioning/partnerships), content (opportunities/timing), investment (signals/assessment).\nAlso generates: scenarios (continues/accelerates/reverses), watch signals, consider/avoid recommendations.\n\nPAIRS WELL WITH: curaition_detect_patterns (patterns to implications), curaition_why_now_analysis (triggers to implications), curaition_trend_analysis (momentum to response), curaition_get_cited_themes (ground in evidence).\n\nEither pattern_id or entity_name must be provided.\n\nExamples:\n  - \"Creator economy pattern for brands?\" -> pattern_id=..., audiences=['brand']\n  - \"Bitcoin implications for product?\" -> entity_name='Bitcoin', audiences=['product']","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"pattern_id":{"type":"string","format":"uuid","description":"Pattern ID to generate implications for (use either pattern_id or entity_name)"},"entity_name":{"type":"string","maxLength":255,"description":"Entity name to generate implications for (use either pattern_id or entity_name)"},"audiences":{"type":"array","items":{"type":"string","enum":["product","brand","content","investment"],"description":"Audience type for implications"},"default":["product","brand","content","investment"],"description":"Audience types to generate implications for"},"time_horizon":{"type":"string","enum":["30d","90d","1y"],"description":"Time horizon for implications and scenarios","default":"90d"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_intelligence_brief","title":"Render Intelligence Brief (internal)","description":"[INTERNAL — dashboard companion] Render a compiled intelligence brief as an interactive view.\n\nDO NOT call directly — called as part of the Enhanced Dashboard \"Generate Brief\" flow:\n1. User clicks \"Generate Brief\" → dashboard collects data via parallel tool calls\n2. Model synthesizes and calls THIS tool with structured output\n3. Intelligence Brief view renders with Strategic Overview, Evidence Chain, Why Now, Recommended Actions, Confidence.","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"entity_name":{"type":"string","minLength":1,"maxLength":200,"description":"Name of the entity this brief is about"},"entity_type":{"type":"string","maxLength":50,"description":"Type of entity (e.g., 'person', 'brand', 'concept')"},"trend_direction":{"type":"string","enum":["rising","falling","stable"],"description":"Current trend direction"},"momentum_score":{"type":"number","description":"Momentum score (ratio of recent to baseline rate)"},"strategic_overview":{"type":"string","description":"Model-generated strategic overview with inline citations [n]"},"evidence_chain":{"type":"array","items":{"type":"object","properties":{"index":{"type":"integer","description":"Citation number (1-based)"},"quote":{"type":"string","description":"Evidence quote or data point"},"source":{"type":"string","description":"Source title or identifier"},"url":{"type":"string","description":"Source URL if available"},"timestamp":{"type":"string","description":"Video timestamp if applicable"}},"required":["index","quote","source"],"additionalProperties":false},"description":"Numbered evidence citations grounding the analysis"},"why_now":{"type":"array","items":{"type":"object","properties":{"trigger_type":{"type":"string","description":"Type of trigger (e.g., 'platform_shift', 'viral_catalyst')"},"description":{"type":"string","description":"Explanation of why this is happening now"},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Confidence in this trigger hypothesis"}},"required":["trigger_type","description","confidence"],"additionalProperties":false},"description":"Trigger hypotheses explaining the timing"},"recommended_actions":{"type":"array","items":{"type":"object","properties":{"audience":{"type":"string","description":"Target audience (e.g., 'content strategists', 'investors')"},"action":{"type":"string","description":"Specific recommended action"},"urgency":{"type":"string","enum":["immediate","near_term","strategic"],"description":"How urgent this action is"}},"required":["audience","action","urgency"],"additionalProperties":false},"description":"Actionable recommendations for different audiences"},"confidence":{"type":"number","minimum":0,"maximum":1,"description":"Overall confidence score for this brief (0-1)"},"confidence_reasoning":{"type":"string","description":"Explanation for the confidence score"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["entity_name","entity_type","trend_direction","momentum_score","strategic_overview","evidence_chain","why_now","recommended_actions","confidence"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_list_calendar_events","title":"List Calendar Events","description":"Browse the hand-curated calendar of real-world events (conferences, races, fashion weeks, regulatory deadlines, etc.) with structured fields: start_date, end_date, location, significance.\n\nWHEN TO USE:\n- Find upcoming events in a domain → domain='f1' or 'fashion' or 'crypto' or 'tech'\n- Filter by date range → start_date_after / start_date_before\n- Filter by event classification → event_type='conference', 'race', 'fashion_week', etc.\n\nDATA MODEL: This tool queries the structured `calendar_events` table — distinct from `canonical_entities` (which holds extracted event-typed entities from content). For free-text event entities surfaced by extraction, use curaition_search_entities with entity_type='event'. The two systems are bridged via `calendar_event_entities` so you can pivot from a calendar event to its content via curaition_get_event_by_slug.\n\nCOVERAGE: Today's calendar covers domains [f1, fashion, crypto, tech] with ~48 hand-curated rows (forward-looking through 2026-12). Other domains return empty until curated.\n\nEVENT TYPES: conference, race, regulatory, product_launch, earnings, halving, upgrade, competition, award_show, fashion_week, summit, other (CHECK-constrained in DB).\n\nRETURNS: { items: [{ event_id, name, slug, domain, event_type, start_date, end_date, location, significance }], count, has_more }\n\nPAIRS WELL WITH: curaition_get_event_by_slug (drill into a found event + see linked entities + content count), curaition_events_in_content (reverse direction: given content, what events does it touch).\n\nExamples:\n  - \"Show me upcoming F1 races\" → domain='f1', event_type='race', start_date_after='2026-04-30'\n  - \"Fashion weeks in 2026\" → event_type='fashion_week'\n  - \"Crypto conferences\" → domain='crypto', event_type='conference'","deprecated":false,"input_schema":{"type":"object","properties":{"domain":{"type":"string","description":"Filter by domain. Today's calendar covers: f1, fashion, crypto, tech. Other domains return zero rows."},"start_date_after":{"type":"string","description":"Inclusive lower bound on start_date (ISO 8601, e.g. '2026-06-01')."},"start_date_before":{"type":"string","description":"Inclusive upper bound on start_date (ISO 8601, e.g. '2026-12-31')."},"event_type":{"type":"string","enum":["conference","race","regulatory","product_launch","earnings","halving","upgrade","competition","award_show","fashion_week","summit","other"],"description":"Filter by event classification. Closed enum (CHECK-constrained in DB)."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Maximum results to return (1-100, default: 20)"},"offset":{"type":"integer","minimum":0,"default":0,"description":"Number of results to skip for pagination"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_list_content","title":"List Content","description":"Browse, filter, and search content. The 'search' parameter matches across title, publisher name, YouTube handle, Instagram handle, and TikTok handle — making this the fastest way to find all content involving a specific entity or creator.\n\nWHEN TO USE:\n- Find all content mentioning a creator or entity by name → search='<name>' (FASTEST, no embedding needed)\n- Browse/filter by domain, content_type, status → structured fields\n- BEST FIRST CALL for entity-specific investigations (faster than semantic_search)\nFor concept-based search (meaning, not exact name), use curaition_semantic_search instead.\n\nTOOL SELECTION:\n- Complete creator/source inventory? → curaition_source_inventory (auto-paginates, returns ALL items)\n- Find content by entity/creator name? → curaition_list_content (this tool, paginated — default limit is 20)\n- Research question spanning multiple angles? → curaition_discover\n- Search by concept/meaning? → curaition_semantic_search\n- Full details for a known item? → curaition_get_content (by ID/slug)\n\nIMPORTANT: Default limit is 20 items per page. For creator/source queries where you need ALL content,\nuse curaition_source_inventory instead, or set limit=100 and paginate with offset.\n\nRETURNS: { items: [{ content_id, title, url, content_type, format, format_metadata, domain_name, status, quality_score, created_at, engagement, sentiment_intent }], count, has_more }\n\nFORMAT FIELD (CUR-428): Each item carries a normalised 'format' string derived from content_type + platform metadata. Taxonomy: instagram_reel, instagram_post, instagram_carousel, tiktok_video, tiktok_slideshow, youtube_short (<60s YouTube), youtube_long (>=60s YouTube), article. Reserved-for-future values (instagram_story, newsletter, podcast_episode) are valid filter inputs but match zero rows today. 'format_metadata' exposes { duration_seconds, asset_count (carousels/slideshows), aspect_ratio } — fields are null when not applicable. Use filter 'format' or multi-select 'format_in' to answer format-mix questions in a single call.\n\nENGAGEMENT FIELD (CUR-402): Each item carries an 'engagement' object when platform metric snapshots exist: { platform, captured_at, likes, views, saves, shares, comments, watch_time_seconds, normalised_score }. Field normalisation: TikTok digg_count → likes, TikTok play_count → views, TikTok collect_count → saves; Instagram plays_count (reels) or views_count (static) → views, Instagram saves_count → saves; YouTube uses video_engagement_snapshots when available, else falls back to live values on the videos table (captured_at=null signals live fallback). Articles and newsletters have engagement=null (no platform metrics). watch_time_seconds is always null in v1 (not captured). normalised_score is always null in v1 (cross-platform percentile is a follow-up ticket).\n\nFRESHNESS FILTER (CUR-410): Pass 'freshness_max_hours' (int) to drop content whose latest engagement snapshot is older than N hours. Capture cadence by platform: YouTube engagement snapshots refresh every ~6h via the RSS sync; Instagram and TikTok refresh every ~24-48h via the Apify scrapers. YouTube items without a dated snapshot row (live-fallback — counts come from the videos table at sync time) PASS THROUGH the filter unfiltered, since their counts are not \"stale\" in the snapshot sense. Pair with engagement.captured_at when you need to confirm the bound on a per-row basis.\n\nSENTIMENT + INTENT (CUR-411): Each item carries a 'sentiment_intent' object once classified: { sentiment_score (-1..1), sentiment_confidence, sentiment_method, intent_class ('product_benefit'|'aesthetic_lifestyle'|'sale'|'informational'|'community'|'other'), intent_confidence, register ('honest'|'flex'|'neutral'|'other'), comment_tone_summary, classified_at }. Unclassified rows return sentiment_intent=null. Filters 'sentiment_min', 'sentiment_max', 'intent_class', 'register' let you rank by resonance or segment the Market Pulse Index. Unclassified rows PASS through filters during rollout — pair filters with a test on sentiment_intent != null if you need strict scope.\n\nPAIRS WELL WITH: curaition_get_content (drill into a result), curaition_get_analysis (analysis for listed items), curaition_get_cited_themes (themes from listed content).\n\nNote: 'search' matches substrings across titles AND publisher/creator names (YouTube, Instagram, TikTok handles). Results filtered by organization visibility.\n\nExamples:\n  - \"Show me recent crypto videos\" -> domain='crypto', content_type='video'\n  - \"Find content with 'Bitcoin' in title\" -> search='Bitcoin'\n  - \"Find all Lego content\" -> search='Lego'\n  - \"Content from creator Marques Brownlee\" -> search='Marques Brownlee'\n  - \"List all F1 articles\" -> domain='f1', content_type='article'\n  - \"What % of Gymshark content this week was reel vs carousel?\" -> search='Gymshark', format_in=['instagram_reel','instagram_carousel','tiktok_video','tiktok_slideshow']\n  - \"Short-form YouTube for Fashion Roadman\" -> search='Fashion Roadman', format='youtube_short'","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"domain":{"type":"string","description":"Filter by domain (e.g., 'crypto', 'f1', 'fashion')"},"content_type":{"type":"string","enum":["article","video","instagram_reel","instagram_post","instagram_carousel","tiktok_video","tiktok_slideshow"],"description":"Filter by content type (e.g., 'article', 'video', 'instagram_reel', 'tiktok_video')"},"format":{"type":"string","enum":["instagram_reel","instagram_post","instagram_carousel","instagram_story","tiktok_video","tiktok_slideshow","youtube_short","youtube_long","article","newsletter","podcast_episode"],"description":"Filter by normalised format (CUR-428). Values: instagram_reel, instagram_post, instagram_carousel, tiktok_video, tiktok_slideshow, youtube_short (<60s YouTube), youtube_long (>=60s YouTube), article. Unsupported-today values (instagram_story, newsletter, podcast_episode) match zero rows."},"format_in":{"type":"array","items":{"type":"string","enum":["instagram_reel","instagram_post","instagram_carousel","instagram_story","tiktok_video","tiktok_slideshow","youtube_short","youtube_long","article","newsletter","podcast_episode"]},"description":"Multi-select format filter (CUR-428). OR'd together; combines with 'format' if both are provided."},"status":{"type":"string","enum":["pending","processing","completed","failed"],"description":"Filter by processing status"},"search":{"type":"string","maxLength":200,"description":"Search term to match across titles, publisher names, and creator handles (YouTube, Instagram, TikTok)"},"min_quality_score":{"type":"number","minimum":0,"maximum":1,"description":"Minimum content quality score (0-1). Filters out promotional/low-quality content. Recommended: 0.5"},"sentiment_min":{"type":"number","minimum":-1,"maximum":1,"description":"Minimum sentiment score (-1.0 to 1.0). Unscored content passes through; set >= 0.3 to bias toward positively-received posts, <= -0.3 for negative."},"sentiment_max":{"type":"number","minimum":-1,"maximum":1,"description":"Maximum sentiment score (-1.0 to 1.0). Unscored content passes through."},"intent_class":{"type":"string","enum":["product_benefit","aesthetic_lifestyle","sale","informational","community","other"],"description":"Filter by intent class (Market Pulse Index): product_benefit, aesthetic_lifestyle, sale, informational, community, other."},"register":{"type":"string","enum":["honest","flex","neutral","other"],"description":"Filter by emotional register (Partner Pulse Big Story): honest (vulnerable), flex (aspirational/performative), neutral, other."},"freshness_max_hours":{"type":"integer","minimum":0,"description":"Filter out content whose latest engagement snapshot is older than N hours. YouTube items without dated snapshots (live-fallback) pass through unfiltered. Capture cadence: YouTube every ~6h via RSS sync; Instagram/TikTok every ~24-48h via Apify scraper."},"created_after":{"type":"string","description":"Inclusive lower bound. ISO-8601 timestamp or date (e.g. '2026-04-10T00:00:00Z' or '2026-04-10'). Bare dates are interpreted in the `tz` timezone (default UTC). Filters on `time_field`."},"created_before":{"type":"string","description":"Exclusive upper bound. ISO-8601 timestamp or date. Bare dates are interpreted in `tz`. Filters on `time_field`."},"tz":{"type":"string","default":"UTC","description":"IANA timezone applied when interpreting bare dates in `created_after`/`created_before` (e.g. 'America/New_York', 'Europe/London'). Defaults to UTC."},"time_field":{"type":"string","enum":["source_published_at","ingested_at"],"default":"source_published_at","description":"Which timestamp `created_after`/`created_before` apply to. 'source_published_at' (default) = when the post went live on the source platform — use for 'last N days of posts'. 'ingested_at' = when CurAItion processed it — use for ops/debugging ('what landed in the pipeline today')."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Maximum results to return (1-100, default: 20)"},"offset":{"type":"integer","minimum":0,"default":0,"description":"Number of results to skip for pagination"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_list_organizations","title":"Search Organizations (super-admin)","description":"[SUPER-ADMIN] Resolve an organization name, slug, or member email to its org_id UUID — cross-org lookup for CurAItion staff. The unfiltered organization list is available to everyone via the curaition://organizations resource; this tool adds the name/slug/email SEARCH that the resource does not (yet) provide.\n\nWORKFLOW: When a super-admin references an organization by name or email:\n1. Call this tool with the reference as the search parameter\n2. Use the returned org_id on subsequent tools to scope results\n\nExamples:\n  - \"Find CultureDefined\" -> search='culturedefined'\n  - \"Who uses crypto@curaition.xyz?\" -> search='crypto@curaition.xyz'\n  - \"Show all organizations\" -> no params","deprecated":false,"input_schema":{"type":"object","properties":{"search":{"type":"string","maxLength":200,"description":"Search by organization name, slug, or member email address. Examples: 'culturedefined', 'crypto@curaition.xyz'"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_list_projects","title":"List Projects","description":"List projects for your organization.\n\nProjects are quarantined investigation layers for time-bound deep-dives (e.g., \"Q2 Beauty Brief\").\nProject sources are isolated from evergreen pattern detection.\n\nUse the returned project IDs with the `project_id` parameter on other tools\nto scope results to a specific project.\n\nExamples:\n  - \"Show me active projects\" -> status='active'\n  - \"Find the beauty brief\" -> search='beauty'","deprecated":false,"input_schema":{"type":"object","properties":{"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"status":{"type":"string","enum":["active","completed","archived"],"description":"Filter by project status (default: all)"},"search":{"type":"string","maxLength":200,"description":"Search by project name or description"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_list_sources","title":"List Sources","description":"Browse, filter, and search input sources (creators, channels, feeds). Returns source metadata — not content items.\n\nWHEN TO USE:\n- \"What YouTube channels do we track?\" -> platform='youtube'\n- \"Show me all crypto sources\" -> domain='crypto'\n- \"Find sources for supercarblondie\" -> search='supercarblondie'\n- \"Which sources have the most content?\" -> sort='content_desc'\n- \"List active Instagram sources\" -> platform='instagram', status='ACTIVE'\n- \"What sources does my org track?\" -> ownership='own' (or source_scope='my_sources'); 'library' shows only the shared library\n\nTOOL SELECTION:\n- Browse available sources/creators? -> curaition_list_sources (THIS TOOL)\n- Complete content inventory for one source? -> curaition_source_inventory\n- Browse content items with filters? -> curaition_list_content\n- Find content by meaning/concept? -> curaition_semantic_search\n\nRETURNS: { items: [{ source_id, name, handle, platform_key, domain_name, status, content_count, last_sync_at, is_library }], total, has_more } — is_library: true = shared library source, false = private/org-subscribed.\n\nPAIRS WELL WITH: curaition_source_inventory (drill into a source's content), curaition_list_content (browse content from sources).","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"platform":{"type":"string","description":"Filter by platform key (e.g., 'youtube', 'instagram', 'tiktok')"},"status":{"type":"string","enum":["ACTIVE","PAUSED","ARCHIVED","ERROR","NEEDS_REVIEW"],"description":"Filter by source status (default: excludes ARCHIVED). NEEDS_REVIEW = sources flagged for manual review (e.g. zombie/auto-disabled)."},"domain":{"type":"string","description":"Filter by content domain (e.g., 'crypto', 'f1', 'fashion', 'automotive')"},"search":{"type":"string","maxLength":200,"description":"Search in source name, handle, or external ID"},"sort":{"type":"string","enum":["name_asc","name_desc","content_desc","content_asc","last_sync_desc","last_sync_asc"],"default":"name_asc","description":"Sort order (default: name_asc)"},"ownership":{"type":"string","enum":["own","global"],"description":"'own' = org-owned sources only, 'global' = library/global sources only. Omit for both."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Maximum results to return (1-100, default: 20)"},"offset":{"type":"integer","minimum":0,"default":0,"description":"Number of results to skip for pagination"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_pattern_due_diligence","title":"Pattern Due Diligence","description":"Compile a one-call due-diligence dossier for a single pattern — everything you need to defend (or kill) it, gathered in one place.\n\nWHEN TO USE: \"is this pattern real / worth acting on?\", \"give me the full picture on pattern X\", pre-brief vetting, lifecycle audits, before quoting a pattern to a client.\n\nRETURNS: {\n  pattern,                       // static detail: type, status, confidence, velocity, domains_crossed, platform_presence, provenance, narrative\n  velocity_history,              // time-series snapshots — did it actually accelerate/peak?\n  journal,                       // lifecycle events: milestones, peaks, transitions, trigger attachments\n  connections,                   // typed entity graph — who shapes/amplifies/disrupts whom\n  baseline_quality,              // confidence caveat: is the momentum organic or an ingestion-onboarding artifact?\n  feedback_summary,              // per-pattern feedback tallies: total / helpful / not_helpful / inaccurate / stale\n  next_steps\n}\n\nKEY PARAMETERS:\n- pattern_id (required): UUID from any pattern listing tool\n- history_limit / journal_limit / connection_limit: cap each section\n\nTOOL SELECTION:\n- Full dossier on ONE pattern in one call? -> curaition_pattern_due_diligence (THIS TOOL)\n- Just the velocity time-series? -> curaition_get_pattern_history\n- Just the lifecycle journal? -> curaition_get_pattern_journal\n- Just the entity graph? -> curaition_get_pattern_connections\n\nPAIRS WELL WITH: curaition_implication_map (turn the dossier into audience-specific actions), curaition_why_now_analysis (causal triggers behind the velocity).\n\nExample:\n  - \"Do a full due-diligence on this pattern\" -> pattern_id='uuid...'","deprecated":false,"input_schema":{"type":"object","properties":{"pattern_id":{"type":"string","format":"uuid","description":"Pattern UUID to compile a due-diligence dossier for"},"history_limit":{"type":"integer","minimum":1,"maximum":500,"default":100,"description":"Max velocity-history snapshots (1-500, default 100)"},"journal_limit":{"type":"integer","minimum":1,"maximum":200,"default":50,"description":"Max lifecycle-journal events (1-200, default 50)"},"connection_limit":{"type":"integer","minimum":1,"maximum":200,"default":50,"description":"Max entity connections, ordered by strength (1-200, default 50)"},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["pattern_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_queue_source_ingest","title":"Queue Source Ingest (Super-Admin)","description":"Queue an on-demand backfill of a new source into a project. Super-admin only.\n\nVALUE: Unblocks \"audit the brand's own channels against its partner ecosystem\" (Partner Pulse Prompt 4) by letting operators spin up ingestion for a specific handle without waiting for the weekly cadence.\n\nFLOW: returns a job_id in \"queued\" state immediately + a pre-flight cost estimate. Workers (Apify scrape → Gemini Batch analysis) run asynchronously — never blocks the MCP call. Poll curaition_get_ingest_status(job_id) for completion.\n\nCONSTRAINTS:\n- Super-admin only\n- Max 90 days backfill per job\n- Max 2 concurrent jobs per org\n- Jobs over cost threshold require confirm_over_threshold=true\n\nHANDLE FORMAT per platform:\n- instagram: \"@gymshark\" or \"gymshark\"\n- tiktok:    \"@creator\" or \"creator\"\n- youtube:   CHANNEL_ID (\"UCxxxxxxxxxxxxxxxxxxxxxx\"). Find it on the channel's About page → \"Share channel\" → \"Copy channel ID\". @handle prefix is NOT accepted today (handle→channel-id resolution is a follow-up).\n\nExamples:\n  - Gymshark owned-channels audit: organization_id=<gymshark_org>, project_id=<owned_channels>, platform='instagram', handle='@gymshark', window_days=30\n  - Competitive TikTok: platform='tiktok', handle='@competitor', window_days=14, priority='high'\n  - YouTube backfill: platform='youtube', handle='UCxxxxx...', window_days=90","deprecated":false,"input_schema":{"type":"object","properties":{"organization_id":{"type":"string","format":"uuid","description":"Target organization UUID. Super-admin picks explicitly — even if the operator is logged into 'their' org."},"project_id":{"type":"string","format":"uuid","description":"Project UUID to attach ingested content to. Must belong to organization_id."},"platform":{"type":"string","enum":["youtube","instagram","tiktok"],"description":"Platform to scrape: 'youtube' | 'instagram' | 'tiktok'."},"handle":{"type":"string","minLength":1,"maxLength":255,"description":"Source handle or channel id (e.g. '@gymshark', 'UCxxxx')."},"window_days":{"type":"integer","minimum":1,"maximum":90,"description":"Backfill window in days (1-90 enforced server-side)."},"content_domain_id":{"type":"integer","exclusiveMinimum":0,"description":"Content domain ID for the resolved source. Required (CUR-538). Resolve via the curaition://domains resource — domain is the source of truth for downstream pattern detection, so an explicit value prevents 'generic' mistagging."},"priority":{"type":"string","enum":["low","normal","high"],"default":"normal"},"confirm_over_threshold":{"type":"boolean","default":false,"description":"Acknowledge charges when the pre-flight cost estimate exceeds the confirmation threshold. Required to proceed on large backfills."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["organization_id","project_id","platform","handle","window_days","content_domain_id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"curaition_registry","title":"Registry","description":"Unified CRUD registry for patterns, trigger hypotheses, and tracked absences.\n\nPattern registry: cultural patterns with entities (driver, accelerant, symptom, beneficiary, victim, interface),\nlifecycle statuses (detected → emerging → accelerating → peaking → normalizing → declining),\nand types (structural_shift, narrative_emergence, power_rebalancing, technology_substrate, cultural_fatigue, professionalisation).\n\nTrigger hypothesis registry: causal explanations for \"why now?\" — trigger types include platform_shift,\nregulatory_moment, technological_threshold, cultural_fatigue, election_cycle, economic_stress, viral_catalyst,\ninstitutional_action, generational_shift, seasonal_pattern.\n\nTracked absence registry: declining or missing entities/patterns — absence types include declining_incumbent,\nmissing_expected, silent_stakeholder, stalled_narrative, platform_exile.\n\nActions: create, get, update, list, archive (patterns/triggers), resolve (absences).\nNote: Results are scoped to your organization.","deprecated":false,"input_schema":{"type":"object","properties":{"registry_type":{"type":"string","enum":["pattern","trigger_hypothesis","tracked_absence"],"description":"Registry type: 'pattern' = cultural patterns (entities with roles, lifecycle statuses), 'trigger_hypothesis' = causal explanations for why something is trending now, 'tracked_absence' = entities/patterns that have gone quiet or are conspicuously missing"},"action":{"type":"string","enum":["create","get","update","list","archive","resolve"],"description":"CRUD action. 'archive' applies to patterns and trigger_hypotheses. 'resolve' applies to tracked_absences (marks absence as resolved)."},"item_id":{"type":"string","format":"uuid","description":"Item UUID (required for get/update/archive/resolve)"},"item_data":{"description":"Item definition object (required for create, optional for update). Schema varies by registry_type."},"filters":{"description":"Filter criteria for list action. Schema varies by registry_type."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Maximum items to return (1-100, default: 20)"},"offset":{"type":"integer","minimum":0,"default":0,"description":"Number of items to skip for pagination"},"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"},"response_detail":{"type":"string","enum":["compact","full"],"default":"full","description":"'compact' returns id/name/type/status/confidence/timestamps per list item (use the 'get' action for full detail). Only affects the 'list' action with response_format='json'."}},"required":["registry_type","action"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"curaition_resolve_entity_profiles","title":"Resolve Entity Profiles","description":"Resolve an entity name to social media profiles and mentioning sources.\n\nReturns TWO ARRAYS:\n• owned_profiles[] — sources the entity OWNS: an input_sources row whose name exactly matches the entity name or one of its aliases (case-insensitive exact match, never substring). ownership_signal is 'name_match' or 'alias_match'. Ordered by content_count DESC. This is the strongest available ownership signal (exact name/alias match against a watched source) — use it to get a creator's own channel/account.\n• mentioning_sources[] — publishers of content that MENTIONS the entity. These are NOT ownership claims; a news outlet that covers Bitcoin is not owned by Bitcoin.\n\nWhen an owned profile exists with a handle, it becomes the primary_profile regardless of mention frequency.\n\nVALUE: Eliminates guessed URLs. \"Whitney Simmons\" resolves to owned youtube.com/@whitneyysimmons — not a third-party outlet that mentioned her. \"Bitcoin\" returns owned_profiles: [] (no source named exactly \"Bitcoin\" in the watched library) and mentioning_sources from crypto media.\n\nUSE CASES:\n- \"What's Chris Williamson's YouTube channel?\" -> entity_name='Chris Williamson' → check owned_profiles\n- \"Who covers DFYNE?\" -> entity_name='DFYNE', entity_type='organization' → check mentioning_sources\n- \"Does Whitney Simmons have a watched source?\" -> entity_name='Whitney Simmons' → owned_profiles non-empty if she does\n\nPAIRS WELL WITH: curaition_batch_resolve_links (batch version for digest production), curaition_search_entities (find entities first).","deprecated":false,"input_schema":{"type":"object","properties":{"entity_name":{"type":"string","minLength":1,"description":"Entity name to resolve (e.g., 'Chris Williamson', 'DFYNE')"},"entity_type":{"type":"string","description":"Filter by entity type (e.g., 'person', 'organization')"},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["entity_name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_scheduled_query","title":"Scheduled Query","description":"Register, inspect, and manage recurring CurAItion queries that materialise their result on a cadence. One action-based tool covering the full lifecycle.\n\nACTIONS:\n- action=\"schedule\" — register a recurring query. Requires name, query_spec, cadence (optional project_id, retention_versions). Each run writes a versioned row; version 2+ carries a diff against the prior successful run — that's the editorial handle for \"what's new this week\".\n- action=\"list\" — show the scheduled-query inventory for this org (optional project_id / active filters, limit/offset). Cadence, next/last run, retention, failure counter per row.\n- action=\"history\" — fetch the latest N versions of one schedule (requires scheduled_query_id; optional limit, include_result). Diffs exist only for version >= 2 and only for successful runs: added/removed, rank_changes, count_changes, scalars, and per-step chain diffs.\n- action=\"run_now\" — force an immediate out-of-cadence run (requires scheduled_query_id). The per-query Redis lock prevents clobbering an in-flight run; the new version lands asynchronously — fetch it via action=\"history\".\n- action=\"delete\" — soft-delete (deactivate) a schedule (requires scheduled_query_id). The dispatcher skips it, but history is preserved.\n\nWHEN TO USE:\n- Repeat analyst query you want to narrate the delta on? schedule once, then history thereafter.\n- Need to see what's scheduled? list. Drill into one schedule's versions + diffs? history.\n- Upstream data changed and you want a fresh version now? run_now. Done with a schedule? delete.\n\nResults are scoped to your organization.","deprecated":false,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["schedule","list","history","run_now","delete"],"description":"schedule = register a recurring query; list = inventory; history = run versions + diffs; run_now = force an out-of-cadence run; delete = deactivate."},"name":{"type":"string","minLength":1,"maxLength":120,"description":"[schedule] Analyst-chosen key, unique within (org, project). e.g. 'gymshark_founder_inventory'."},"query_spec":{"anyOf":[{"type":"object","properties":{"tool":{"type":"string","minLength":1,"description":"Tool name, e.g. 'curaition_list_content'"},"params":{"type":"object","additionalProperties":{},"description":"Tool-specific params dict. Omit for tools that take no args."}},"required":["tool"],"additionalProperties":false},{"type":"array","items":{"type":"object","properties":{"tool":{"type":"string","minLength":1,"description":"Tool name, e.g. 'curaition_list_content'"},"params":{"type":"object","additionalProperties":{},"description":"Tool-specific params dict. Omit for tools that take no args."}},"required":["tool"],"additionalProperties":false},"minItems":1}],"description":"[schedule] Either a single {tool, params} step or an ordered list of steps (chain)."},"cadence":{"type":"string","minLength":1,"description":"[schedule] 'daily' | 'weekly' | 'biweekly' | 'monthly' | a 5-field cron expression. Invalid values are rejected by the API with 400."},"retention_versions":{"type":"integer","minimum":1,"maximum":52,"description":"[schedule] How many historical versions to keep. Defaults to 12 when omitted."},"scheduled_query_id":{"type":"string","format":"uuid","description":"[history|run_now|delete] The scheduled query's id."},"project_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"[schedule|list] Project scope. Null/omitted = org-wide."},"active":{"type":"boolean","description":"[list] Filter by active flag. Omit for both active + deactivated rows."},"limit":{"type":"integer","minimum":1,"maximum":250,"description":"[list|history] Max rows. Defaults: list=50, history=12."},"offset":{"type":"integer","minimum":0,"description":"[list] Pagination offset. Default 0."},"include_result":{"type":"boolean","description":"[history] Include the full result JSONB per version. Off by default — diffs alone are usually enough."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["action"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"curaition_search_entities","title":"Search Entities","description":"Search for entities (people, brands, organizations, etc.) extracted from content.\n\nWHEN TO USE: Finding specific entities by name or type, getting entity counts across content. For entity *relationships* (who connects to whom), use curaition_get_entity_context (mode='relationships'). For entities that appear *together*, use curaition_get_entity_context (mode='cooccurrence').\n\nRETURNS: { entities: [{ entity_name, entity_type, content_count, domains, first_seen, last_seen }], count, has_more }\n\nPAIRS WELL WITH: curaition_get_entity_context (mode='relationships' for connections, mode='cooccurrence' for co-occurrence networks), curaition_trend_analysis (momentum for found entities), curaition_why_now_analysis (explain trending entities).\n\nEntity types: person, organization, brand, product, location, event, concept, technology, trend.\n\nEVENTS — TWO-SYSTEM NOTE (CUR-542): entity_type='event' here returns extracted event-typed entities from content (free-text, no structured dates). For the curated, structured event calendar with start_date / end_date / location / event_type, use curaition_list_calendar_events instead. The two are bridged via the calendar_event_entities join table — call curaition_get_event_by_slug on a calendar event to see which extracted entities link to it. Casing caveat: 'event' and 'EVENT' currently exist as separate buckets in canonical_entities (~853 + ~158 rows respectively); pass either based on what your downstream rendering needs.\n\nExamples:\n  - \"Find all people in crypto content\" -> entity_type='person', domain='crypto'\n  - \"Search for entities named Elon\" -> query='Elon'\n  - \"What brands appear in F1 content?\" -> entity_type='brand', domain='f1'\n  - \"Event entities mentioned in fashion content\" -> entity_type='event', domain='fashion' (also try curaition_list_calendar_events for structured/dated equivalent)\n\nEach result carries an `identity` block (confidence: high|medium|low, plus disambiguation_risk). ALWAYS check `identity.confidence` before citing an entity in a client-facing deliverable — `low` or a `surname_collision`/`sparse` risk means the name may be a namesake, a sparse stub, or a merged identity; verify before relying on it.","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"query":{"type":"string","maxLength":200,"description":"Search term to match against entity names"},"entity_type":{"type":"string","description":"Filter by entity type (e.g., 'person', 'organization', 'brand', 'product')"},"domain":{"type":"string","description":"Filter by content domain"},"created_after":{"type":"string","description":"Inclusive lower bound. ISO-8601 timestamp or date (e.g. '2026-04-10T00:00:00Z' or '2026-04-10'). Bare dates are interpreted in the `tz` timezone (default UTC). Filters on `time_field`."},"created_before":{"type":"string","description":"Exclusive upper bound. ISO-8601 timestamp or date. Bare dates are interpreted in `tz`. Filters on `time_field`."},"tz":{"type":"string","default":"UTC","description":"IANA timezone applied when interpreting bare dates in `created_after`/`created_before` (e.g. 'America/New_York', 'Europe/London'). Defaults to UTC."},"time_field":{"type":"string","enum":["source_published_at","ingested_at"],"default":"source_published_at","description":"Which timestamp `created_after`/`created_before` apply to. 'source_published_at' (default) = when the post went live on the source platform — use for 'last N days of posts'. 'ingested_at' = when CurAItion processed it — use for ops/debugging ('what landed in the pipeline today')."},"limit":{"type":"integer","minimum":1,"maximum":100,"default":20,"description":"Maximum results to return (1-100, default: 20)"},"offset":{"type":"integer","minimum":0,"default":0,"description":"Number of results to skip for pagination"},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_semantic_search","title":"Semantic Search","description":"Search content by meaning using vector embeddings — finds conceptually related content across different terminology.\n\nWHEN TO USE: Research questions, concept-based search (not keyword matching), exploring topics where exact terms vary. For exact title substring matching, use curaition_list_content instead.\n\nTOOL SELECTION:\n- Research question spanning multiple angles? → curaition_discover\n- Search by concept/meaning? → curaition_semantic_search (this tool)\n- Browse/filter by domain, type, date? → curaition_list_content\n- Full details for a known item? → curaition_get_content (by ID/slug)\n\nQUERY SYNTAX: Natural-language phrases only. The query is embedded as a single vector, so:\n- Boolean operators (OR, AND, NOT) and quoted phrases are NOT respected — \"A OR B\" is embedded as the three-token phrase, not as a disjunction. Issue two calls and merge results client-side if you need a real OR.\n- Longer noun-stacked queries (e.g. \"Brand Collection Subproduct launch timing\") still work, but narrower queries usually rank better than very broad ones.\n- For exact substring matching on titles/URLs, use curaition_list_content.\n\nRETURNS: { query, count, results: [{ content_id, title, url, content_type, format, format_metadata, domain, similarity_score, excerpt, engagement, sentiment_intent }] }\n\nFORMAT FIELD (CUR-428): Each result carries a normalised 'format' derived from content_type + platform metadata. Taxonomy: instagram_reel, instagram_post, instagram_carousel, tiktok_video, tiktok_slideshow, youtube_short (<60s YouTube), youtube_long (>=60s YouTube), article. 'format_metadata' exposes { duration_seconds, asset_count, aspect_ratio } where applicable. Filter via 'format' or multi-select 'format_in' to scope semantic results to a specific format (e.g. only reels for a Partner Pulse comparison).\n\nENGAGEMENT FIELD (CUR-402): Each result carries an 'engagement' object when platform metric snapshots exist: { platform, captured_at, likes, views, saves, shares, comments, watch_time_seconds, normalised_score }. TikTok digg→likes, play→views, collect→saves. Instagram plays_count (reels) or views_count (static)→views, saves_count→saves. YouTube reads video_engagement_snapshots when available, else live videos-table values (captured_at=null signals live fallback). Articles → engagement=null.\n\nSENTIMENT + INTENT (CUR-411): sentiment_intent is populated once classified: { sentiment_score (-1..1), sentiment_confidence, intent_class, register, comment_tone_summary, classified_at }. Filters 'sentiment_min'/'sentiment_max'/'intent_class'/'register' narrow the result set; unclassified rows pass through by default.\n\nERRORS: Returns a structured [TIMEOUT] error (not a silent hang) when the query cannot complete inside the tool budget — fall back to curaition_list_content or narrow the query.\n\nPAIRS WELL WITH: curaition_get_cited_themes (extract themes from results), curaition_detect_patterns (find patterns across results), curaition_get_entity_context (mode='cooccurrence' to explore entity networks), curaition_get_content (drill into a specific result).\n\nExamples:\n  - \"Institutional Bitcoin adoption\" -> query='institutional Bitcoin adoption'\n  - \"F1 sustainability\" -> query='F1 sustainability trends', domain='f1'","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"query":{"type":"string","minLength":3,"maxLength":1000,"description":"Natural language search query"},"domain":{"type":"string","description":"Filter by domain (e.g., 'crypto', 'f1', 'fashion')"},"content_type":{"type":"string","enum":["article","video","instagram_reel","instagram_post","instagram_carousel","tiktok_video","tiktok_slideshow"],"description":"Filter by content type (e.g., 'article', 'video', 'instagram_reel', 'tiktok_video')"},"format":{"type":"string","enum":["instagram_reel","instagram_post","instagram_carousel","instagram_story","tiktok_video","tiktok_slideshow","youtube_short","youtube_long","article","newsletter","podcast_episode"],"description":"Filter by normalised format (CUR-428). Values: instagram_reel, instagram_post, instagram_carousel, tiktok_video, tiktok_slideshow, youtube_short (<60s YouTube), youtube_long (>=60s YouTube), article. Unsupported-today values (instagram_story, newsletter, podcast_episode) match zero rows."},"format_in":{"type":"array","items":{"type":"string","enum":["instagram_reel","instagram_post","instagram_carousel","instagram_story","tiktok_video","tiktok_slideshow","youtube_short","youtube_long","article","newsletter","podcast_episode"]},"description":"Multi-select format filter (CUR-428). OR'd together; combines with 'format' if both are provided."},"embedding_type":{"type":"string","enum":["article_body","article_overview","article_keywords","transcript","combined","outline","entities"],"description":"Filter by embedding type"},"include_citations":{"type":"boolean","default":false,"description":"Include citation data for each search result"},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum results to return (1-50, default: 20)"},"min_similarity":{"type":"number","minimum":0,"maximum":1,"default":0.5,"description":"Minimum similarity score (0-1, default: 0.5)"},"min_quality_score":{"type":"number","minimum":0,"maximum":1,"description":"Minimum content quality score (0-1). Filters out promotional/low-quality content. Recommended: 0.5"},"sentiment_min":{"type":"number","minimum":-1,"maximum":1,"description":"Minimum sentiment score (-1.0 to 1.0). Unscored content passes through; set >= 0.3 to bias toward positively-received posts, <= -0.3 for negative."},"sentiment_max":{"type":"number","minimum":-1,"maximum":1,"description":"Maximum sentiment score (-1.0 to 1.0). Unscored content passes through."},"intent_class":{"type":"string","enum":["product_benefit","aesthetic_lifestyle","sale","informational","community","other"],"description":"Filter by intent class (Market Pulse Index): product_benefit, aesthetic_lifestyle, sale, informational, community, other."},"register":{"type":"string","enum":["honest","flex","neutral","other"],"description":"Filter by emotional register (Partner Pulse Big Story): honest (vulnerable), flex (aspirational/performative), neutral, other."},"response_detail":{"type":"string","enum":["compact","standard","full"],"default":"standard","description":"Detail level: 'compact' (ID+title+score+domain, ~2KB total), 'standard' (+ truncated excerpt), 'full' (complete excerpts). Use 'compact' for large result sets."},"created_after":{"type":"string","description":"Inclusive lower bound. ISO-8601 timestamp or date (e.g. '2026-04-10T00:00:00Z' or '2026-04-10'). Bare dates are interpreted in the `tz` timezone (default UTC). Filters on `time_field`."},"created_before":{"type":"string","description":"Exclusive upper bound. ISO-8601 timestamp or date. Bare dates are interpreted in `tz`. Filters on `time_field`."},"tz":{"type":"string","default":"UTC","description":"IANA timezone applied when interpreting bare dates in `created_after`/`created_before` (e.g. 'America/New_York', 'Europe/London'). Defaults to UTC."},"time_field":{"type":"string","enum":["source_published_at","ingested_at"],"default":"source_published_at","description":"Which timestamp `created_after`/`created_before` apply to. 'source_published_at' (default) = when the post went live on the source platform — use for 'last N days of posts'. 'ingested_at' = when CurAItion processed it — use for ops/debugging ('what landed in the pipeline today')."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"curaition_sentinel_get_dossier","title":"Get Sentinel Creator Dossier","description":"Read the latest non-superseded creator risk dossier for a handle. Returns the full Markdown dossier body inline (or JSON envelope via response_format='json').\n\nUSE THIS to read a dossier produced by the batch vetting pipeline — it returns the actual dossier content inline (rather than just a dossier_id pointer to an HTTP endpoint the client can't call). Vetting is run server-side by the batch pipeline; there is no interactive vet tool to call first.\n\nDISAMBIGUATION:\n- Same handle on multiple platforms → most recent wins. Set platform='instagram'|'tiktok'|'youtube' to pin one.\n- Multiple dossiers across projects in your org → most recent wins. Set project_id to pin one.\n\nSHAPE: returns id, handle, platform, project_id, recommendation ('proceed' | 'proceed_with_conditions' | 'decline'), max_severity ('severe' | 'moderate' | 'borderline' | 'none'), items_analyzed, dossier_md (formatted markdown body), dossier_json (structured payload).\n\nVISIBILITY: super-admins see any dossier; org members see only dossiers in projects their org owns. Cross-org reads return 404 (not 403) so existence isn't leaked.\n\nThe response includes an `identity` block: an unverified NAME-MATCH namesake check. If identity confidence is `low` or the disambiguation_risk flags a collision/sparse stub, the dossier evidence may belong to a DIFFERENT individual with the same name — verify identity before acting. A `high` confidence here is NOT confirmation (it can reflect a more prominent namesake), so treat the block only as a prompt to verify.","deprecated":false,"input_schema":{"type":"object","properties":{"handle":{"type":"string","minLength":1,"maxLength":255,"description":"Creator handle, e.g. '@bradleymartyn' or 'bradleymartyn'."},"platform":{"type":"string","enum":["instagram","tiktok","youtube"],"description":"Optional platform filter ('instagram' | 'tiktok' | 'youtube'). When the same handle appears on multiple platforms, the most recent dossier wins unless this is set. The selected platform is echoed back in the response."},"project_id":{"type":"string","format":"uuid","description":"Optional project UUID filter. When set, narrows the lookup to one project; otherwise the most recent dossier across the caller's org-visible projects wins."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["handle"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_source_coverage_audit","title":"Source Coverage Audit","description":"Aggregate coverage picture over your sources in one call — the platform/domain/status mix plus the operational gaps you'd otherwise page for by hand.\n\nWHEN TO USE: \"audit our source coverage\", \"which sources have no content?\", \"what hasn't synced lately?\", \"how are sources split across platforms/domains?\", health/triage sweeps.\n\nRETURNS: {\n  total_sources,\n  sources_by_platform, sources_by_domain, sources_by_status,\n  zero_content: { count, sample[] },       // active sources that ingested nothing\n  never_synced: { count, sample[] },        // last_sync_at IS NULL\n  stale: { threshold_days, count, sample[] },// no sync in > stale_days\n  high_volume: sample[],                     // heaviest contributors\n  coverage_warnings[]\n}\n\nKEY PARAMETERS:\n- stale_days: a source is \"stale\" if it hasn't synced in this many days (default 30)\n- sample_limit: max sources listed per gap (default 25)\n- source_scope: \"all\" (default) | \"my_sources\" | \"library\"\n- project_id: scope to one project's sources\n\nTOOL SELECTION:\n- Aggregate coverage/health across ALL sources? -> curaition_source_coverage_audit (THIS TOOL)\n- Browse/filter the source list itself? -> curaition_list_sources\n- Complete content inventory for ONE source? -> curaition_source_inventory\n\nPAIRS WELL WITH: curaition_list_sources (drill into a flagged source), curaition_source_inventory (inspect one source's content).\n\nExamples:\n  - \"Audit my source coverage\" -> source_scope='my_sources'\n  - \"Which sources are stale (>60d)?\" -> stale_days=60","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"stale_days":{"type":"integer","minimum":1,"maximum":365,"default":30,"description":"A source counts as 'stale' if it hasn't synced in this many days (default 30, max 365)."},"sample_limit":{"type":"integer","minimum":1,"maximum":100,"default":25,"description":"Max sources to list in each gap sample (zero-content / never-synced / stale / high-volume). Default 25, max 100."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_source_inventory","title":"Source Inventory","description":"Complete inventory of a creator or source's content in CurAItion. By DEFAULT returns the FULL catalogue (all time) — total count, date range, format breakdown, and the full list of content items, automatically paginated.\n\nWHEN TO USE:\n- \"List all content from Fashion Roadman\" -> source_name='Fashion Roadman'\n- \"What has Bliss Foster published?\" -> source_name='Bliss Foster'\n- \"Show me everything by Katie Robinson\" -> source_name='Katie Robinson'\n- \"How much content do we have from MKBHD?\" -> source_name='MKBHD'\n\nThis tool is the BEST CHOICE for creator/source queries. It auto-paginates internally (up to 500 items) so you get the complete picture in one call. No need for manual offset pagination.\n\nRECENCY WINDOW: leave 'days' UNSET for the full catalogue. Only pass 'days' (1–365) to narrow to recent content (e.g. days=30 for the last month). When a window is applied, the count, format breakdown AND date range are all windowed to it, and the response flags truncation via 'all_time_total' / window_days plus a \"Showing N of M all-time\" note — re-call without 'days' to see everything.\n\nFor filtering or browsing (not a specific creator), use curaition_list_content instead.\n\nRETURNS: { source_name, total_items, all_time_total, window_days, date_range, format_breakdown, entity_mentions, items: [{ content_id, title, content_type, url, published_at }] }","deprecated":false,"input_schema":{"type":"object","properties":{"source_name":{"type":"string","minLength":1,"maxLength":200,"description":"Creator or source name to look up (e.g., 'Fashion Roadman', 'Bliss Foster')"},"days":{"type":"integer","minimum":1,"maximum":365,"description":"Optional recency window in days (1–365). OMIT for the full catalogue (default). Only pass this to narrow to recent content, e.g. days=30 for the last month. When set, the count, format breakdown AND date range are all windowed to it."},"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"required":["source_name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_trend_analysis","title":"Analyze Entity Trends","description":"Discover who's rising and falling in cultural relevance—identify opportunities before they're obvious.\n\nVALUE: Find momentum shifts signaling emerging narratives or vulnerable incumbents. Production examples: Greenland +1,461%, EU Regulatory +4,171%, Aston Martin -83%.\n\nUSE THIS WHEN: \"what's trending?\", \"what's rising/falling?\", investment timing, content planning, competitive monitoring.\n\nPAIRS WELL WITH: curaition_detect_patterns (cross-reference trends with patterns), curaition_get_entity_context (mode='cooccurrence' for networks of trending entities), curaition_why_now_analysis (triggers behind momentum), curaition_absence_scan (rising vs declining).\n\nTECHNICAL: Compares entity mentions in recent period vs baseline. >50% increase = rising, >50% decrease = falling.\n\nExamples:\n  - \"Trending in crypto?\" -> domain='crypto', recent_days=7\n  - \"Who's rising fastest?\" -> limit=10","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"content_type":{"type":"string","enum":["article","video","instagram_reel","instagram_post","instagram_carousel","tiktok_video","tiktok_slideshow"],"description":"Filter by content type (e.g., 'article', 'video', 'instagram_reel', 'tiktok_video')"},"domain":{"type":"string","description":"Filter by content domain (e.g., 'crypto', 'f1')"},"entity_name":{"type":"string","maxLength":200,"description":"Narrow analysis to content co-mentioning a specific entity. When set, the tool fails loudly instead of returning an empty success: ERR_NOT_FOUND if the entity has no mentions in the selected scope/window, ERR_INSUFFICIENT_BASELINE if it has less than 7 days of history in scope."},"entity_type":{"type":"string","description":"Filter by entity type (e.g., 'person', 'organization', 'brand')"},"recent_days":{"type":"integer","minimum":1,"maximum":30,"default":7,"description":"Number of recent days to analyze (1-30, default: 7)"},"baseline_days":{"type":"integer","minimum":7,"maximum":90,"default":30,"description":"Total baseline period in days (7-90, default: 30)"},"citation_depth":{"type":"string","enum":["none","summary","full"],"default":"summary","description":"Citation detail level: 'none', 'summary' (default), or 'full'"},"min_quality_score":{"type":"number","minimum":0,"maximum":1,"description":"Minimum content quality score (0-1). Filters out promotional/low-quality content from trend calculations. Recommended: 0.5"},"exclude_publishers":{"type":"boolean","default":true,"description":"Exclude publisher/platform entities (news sites, social/trading platforms like NewsBTC, CryptoPotato, TradingView) from the movers (default: true). Parity with get_entity_context."},"limit":{"type":"integer","minimum":1,"maximum":50,"default":20,"description":"Maximum entities to return (1-50, default: 20)"},"created_after":{"type":"string","description":"Inclusive lower bound. ISO-8601 timestamp or date (e.g. '2026-04-10T00:00:00Z' or '2026-04-10'). Bare dates are interpreted in the `tz` timezone (default UTC). Filters on `time_field`."},"created_before":{"type":"string","description":"Exclusive upper bound. ISO-8601 timestamp or date. Bare dates are interpreted in `tz`. Filters on `time_field`."},"tz":{"type":"string","default":"UTC","description":"IANA timezone applied when interpreting bare dates in `created_after`/`created_before` (e.g. 'America/New_York', 'Europe/London'). Defaults to UTC."},"time_field":{"type":"string","enum":["source_published_at","ingested_at"],"default":"source_published_at","description":"Which timestamp `created_after`/`created_before` apply to. 'source_published_at' (default) = when the post went live on the source platform — use for 'last N days of posts'. 'ingested_at' = when CurAItion processed it — use for ops/debugging ('what landed in the pipeline today')."},"mature_sources_only":{"type":"boolean","description":"When true, restrict baseline/recent windows to sources that have content predating the analysis window (content-age maturity), so momentum reflects real change rather than ingestion onboarding. Recommended when an externally-publishable answer is needed."},"ranking":{"type":"string","enum":["weighted","raw"],"default":"weighted","description":"SP6 domain-lens ranking for the balanced (no-domain) view: 'weighted' (default) = per-domain percentile normalization + org-interest weighting for org users; 'raw' = legacy deviation order. Super-admin cross-org sessions (source_scope='all_orgs') always get raw; pass org_id to rank through that org's lens. No effect when 'domain' is set."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_weekly_delta","title":"Weekly Delta","description":"What changed this week — a one-call digest of the movers in your cultural intelligence: who's rising, who's falling, who's gone quiet, plus a data-quality caveat.\n\nWHEN TO USE: \"what changed this week?\", \"give me the weekly rundown\", Monday-morning briefings, recurring delta checks, \"anything notable lately?\". Composes momentum + absence in one shot so you don't chain three tools by hand.\n\nRETURNS: {\n  window,           // { recent_days, baseline_days, domain }\n  risers,           // entities accelerating vs baseline (momentum view)\n  fallers,          // entities decelerating vs baseline\n  gone_quiet,       // entities that have conspicuously dropped off (absence scan)\n  baseline_quality, // caveat: is this movement organic or an ingestion-onboarding artifact?\n  next_steps\n}\n\nKEY PARAMETERS (most calls only need domain and/or source_scope):\n- domain: focus on one domain (omit for a balanced cross-domain digest)\n- source_scope: 'my_sources' (your own sources) vs 'library' (the whole market) — if unclear which the user wants, ASK before calling\n- recent_days (default 7) / baseline_days (default 30): the \"this week\" window vs what it's compared against\n\nNOTE: This digest is fast (momentum + absence only). It deliberately does NOT run pattern detection inline — use the next_steps to drill into curaition_detect_patterns or curaition_why_now_analysis when a mover warrants it.\n\nPAIRS WELL WITH: curaition_why_now_analysis (explain a riser), curaition_detect_patterns (emerging patterns behind the moves), curaition_pattern_due_diligence (vet a specific pattern).\n\nExamples:\n  - \"What changed in crypto this week?\" -> domain='crypto'\n  - \"Weekly rundown of my sources\" -> source_scope='my_sources'","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"domain":{"type":"string","maxLength":50,"description":"Focus the digest on a single domain (e.g., 'crypto', 'f1'). Omit for a balanced cross-domain scan."},"recent_days":{"type":"integer","minimum":1,"maximum":30,"default":7,"description":"The 'this week' window in days — what counts as recent (1-30, default: 7)."},"baseline_days":{"type":"integer","minimum":7,"maximum":90,"default":30,"description":"Baseline period the recent window is compared against (7-90, default: 30)."},"limit":{"type":"integer","minimum":1,"maximum":25,"default":10,"description":"Max entities per section — risers, fallers, gone-quiet (1-25, default: 10). Kept small so the digest stays scannable."},"min_quality_score":{"type":"number","minimum":0,"maximum":1,"description":"Minimum content quality score (0-1) for the momentum view. Filters promotional/low-quality content. Recommended: 0.5"},"exclude_publishers":{"type":"boolean","default":true,"description":"Exclude publisher/platform entities (news sites, social/trading platforms) from the risers/fallers (default: true). Parity with get_entity_context."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"curaition_why_now_analysis","title":"Why Now? Analysis","description":"Explain why something is trending NOW—causal intelligence with validated trigger hypotheses.\n\nWHEN TO USE: \"why is X trending?\", \"what caused this?\", understanding timing of cultural shifts. Requires either entity_name or pattern_id.\n\nRETURNS: { entity_name, hypotheses: [{ trigger_type, description, confidence, supporting_evidence, temporal_correlation }], context: { recent_mentions, baseline_mentions, momentum_score } }\n\nKEY PARAMETERS:\n- entity_name or pattern_id (one required)\n- time_window: '7d', '14d', '30d' (default: '30d')\n- max_hypotheses: 1-10 (default: 5)\n- Trigger types: platform_shift, regulatory_moment, technological_threshold, cultural_fatigue, election_cycle, economic_stress, viral_catalyst, institutional_action, generational_shift, seasonal_pattern\n\nPAIRS WELL WITH: curaition_trend_analysis (identify trends then explain why), curaition_detect_patterns (explain pattern triggers), curaition_implication_map (\"why now?\" to \"so what?\"), curaition_registry (save trigger hypotheses for tracking).\n\nExamples:\n  - \"Why is Bitcoin trending?\" -> entity_name='Bitcoin', time_window='7d'\n  - \"Why is this pattern accelerating?\" -> pattern_id='uuid...'","deprecated":false,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","format":"uuid","description":"Scope results to a specific project. When set, returns project source content + evergreen content in matching domains. When omitted, returns only evergreen (non-project) content. Use curaition_list_projects to discover available projects."},"org_id":{"type":"string","format":"uuid","description":"Super admin only: Override organization context to view any org's content. Use with project_id for full scoping."},"source_scope":{"type":"string","enum":["all","my_sources","global","all_orgs","library","combined"],"default":"all","description":"Content scope (default 'all'). 'all' = your org's subscribed sources + the CurAItion shared library. 'my_sources' = your org's sources only (the library stays included as the always-on baseline; use 'library' to read ONLY the library). 'library' = ONLY the CurAItion shared library — never any org's private content. 'all_orgs' = super-admin only; explicit cross-org (no org filter); NOT a default. DEPRECATED (removed in MCP /v2): 'combined' → use 'all'; 'global' → use 'library'. RECOMMENDED: 'my_sources' for org-specific questions; use 'all' only for 'the market'/'the landscape'."},"entity_name":{"type":"string","maxLength":255,"description":"Entity name to analyze (use either entity_name or pattern_id)"},"pattern_id":{"type":"string","format":"uuid","description":"Pattern ID to analyze (use either entity_name or pattern_id)"},"domains":{"type":"array","items":{"type":"string","maxLength":50},"description":"Content domains for web search context (e.g., ['crypto', 'tech'])"},"time_window":{"type":"string","enum":["7d","14d","30d","90d"],"default":"30d","description":"Time window for analysis"},"max_hypotheses":{"type":"integer","minimum":1,"maximum":10,"default":5,"description":"Maximum hypotheses to generate (1-10, default: 5)"},"mature_sources_only":{"type":"boolean","description":"When true, restrict baseline/recent windows to sources that have content predating the analysis window (content-age maturity), so momentum reflects real change rather than ingestion onboarding. Recommended when an externally-publishable answer is needed."},"response_format":{"type":"string","enum":["json","markdown"],"default":"markdown","description":"Output format: 'markdown' for human-readable or 'json' for machine-readable"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"fetch","title":"Fetch CurAItion Content","description":"Retrieve complete content from the CurAItion database by ID.\n\nReturns the full document with title, text content, URL, and metadata including\nentities, domains, and analysis results. Use this after the search tool to get\ncomplete information for analysis and citation.","deprecated":false,"input_schema":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"Content UUID from a search result"}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"search","title":"Search CurAItion Content","description":"Search the CurAItion cultural intelligence database for relevant content.\n\nReturns matching videos, articles, and social media content with titles, URLs, and text snippets.\nCovers 17 domains: crypto, fashion, activewear, sport, gaming, tech, music, f1, food, social commentary, and more.\nDatabase contains a large, continuously-growing library of analyzed content.\n\nUse the fetch tool to get complete content for any result.\n\nNOT FOR \"LATEST INSIGHTS / WHAT'S NEW / TRENDS / WHAT'S MOVING\": this tool returns\nraw CONTENT ITEMS (a recency feed), not synthesized insights. For a topic-less\n\"what are the latest insights?\", \"what's new?\", \"what's trending / accelerating?\",\nor \"what patterns are emerging?\", call curaition_weekly_delta (one-call digest of\nrisers/fallers/gone-quiet movers) or curaition_discover instead — those return the\nmovers and emerging patterns the user actually means by \"insights\". Use this search\nonly when the user wants specific content items by topic/keyword.","deprecated":false,"input_schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"description":"Search query string. Natural language queries work best."}},"required":["query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"},"annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}}],"resources":[{"uri":"curaition://domains","name":"curaition-domains","title":"Content Domains","description":"Active content domains (e.g. crypto, f1, fashion, tech, gaming) plus the subset with curated calendar coverage. Returns { domains: [...], calendar_coverage: [...] }. Domains are global — no org filtering applied.","mime_type":"application/json"},{"uri":"curaition://organizations","name":"curaition-organizations","title":"Organizations","description":"Organizations visible to the caller. Super-admins see all active orgs (unfiltered); regular users see only their own org. Returns { items: [...], total: number }. For super-admin name/slug/email search, use curaition_list_organizations with the `search` param.","mime_type":"application/json"}],"prompts":[],"build_generated_at":"<runtime>"}