# Meta Council (remote · meta-council.com)

Multi-expert decision intelligence with transparent synthesis and auditable workflows.

- Trust score: 77/100 (medium)
- Change this week: +9
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `meta-council.com`: 77/100 (this document), [markdown](https://verifymcp.io/servers/com-meta-council-decision-intelligence/meta-council.md), [page](https://verifymcp.io/servers/com-meta-council-decision-intelligence/meta-council)

## Channel facts

- Endpoint: `https://meta-council.com/mcp`
- Transports: `streamable-http`
- Auth: `required`
- Version: `1.4.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 89/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation is enforced on tool calls, but the challenge carries no valid RFC 9728 metadata, so a client cannot discover where to get a token.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 71/100
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 8754 tokens (~93/item across 94 items; 94 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 81/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 35% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http com-meta-council-decision-intelligence https://meta-council.com/mcp
```

### Codex

```toml
[mcp_servers.com-meta-council-decision-intelligence]
url = "https://meta-council.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-meta-council-decision-intelligence": {
      "type": "remote",
      "url": "https://meta-council.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-meta-council-decision-intelligence --url https://meta-council.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-meta-council-decision-intelligence:
    url: "https://meta-council.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "com-meta-council-decision-intelligence": {
      "type": "http",
      "url": "https://meta-council.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 77, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 76, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 75, +5)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 70, +2)

- [security] Tool “ticket_comment” rewrote its description, which is the text the model reads
- [security] Tool “ticket_create” rewrote its description, which is the text the model reads
- [security] Tool “ticket_list” rewrote its description, which is the text the model reads
- [security] Tool “ticket_update” rewrote its description, which is the text the model reads
- [functional] Server version: 2.3.0 → 2.5.0
- [functional] New tool “ticket_validation_finalize”
- [cosmetic] “ticket_update” added an optional parameter “clear_parent”
- [cosmetic] “ticket_update” added an optional parameter “clear_session”
- [cosmetic] “ticket_update” added an optional parameter “clear_workflow_session”
- [cosmetic] “ticket_update” added an optional parameter “effort_points”
- [cosmetic] “ticket_update” added an optional parameter “external_ref”
- [cosmetic] “ticket_update” added an optional parameter “parent_id”
- [cosmetic] “ticket_update” added an optional parameter “session_id”
- [cosmetic] “ticket_update” added an optional parameter “workflow_session_id”
- [cosmetic] “ticket_create” added an optional parameter “effort_points”
- [cosmetic] “ticket_create” added an optional parameter “external_ref”
- [cosmetic] “ticket_create” added an optional parameter “order_index”
- [cosmetic] “ticket_create” added an optional parameter “session_id”
- [cosmetic] “ticket_create” added an optional parameter “workflow_session_id”
- [cosmetic] “ticket_list” added an optional parameter “cursor”
- [cosmetic] “ticket_list” added an optional parameter “recursive”
- [cosmetic] “ticket_list” added an optional parameter “session_id”
- [cosmetic] “ticket_list” added an optional parameter “workflow_session_id”
- [cosmetic] “ticket_update” added an optional parameter “clear_effort_points”
- [cosmetic] “ticket_create” reworded the description of “status”
- [cosmetic] “ticket_update” reworded the description of “status”
- [cosmetic] “ticket_comment” dropped the optional parameter “author”
- [cosmetic] “ticket_create” dropped the optional parameter “creator_agent”

### 2026-07-29 (score 68, −1)

- [functional regression] Schema quality: 7452 → 8217
- [functional] Server version: 2.1.0 → 2.3.0
- [functional] New tool “preview_accounting_ticket_sync”
- [functional] New tool “sync_accounting_tickets”
- [functional] New tool “ticket_batch_create”
- [functional] New tool “ticket_plan”

### 2026-07-28 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 68, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 67)

First indexed and scored.

## MCP tools (94)

### `run_council` (~186 tokens)

Run Council

Submit a question or decision to Meta Council. A panel of specialized AI agents will independently analyze it, then a synthesis step combines their opinions into a unified recommendation with full transparency. Starts asynchronously by default; use get_session with the returned session id.

Input parameters:

- `model` (string): Model to use (e.g., 'claude-sonnet-4-6', 'gpt-4o', 'deepseek-chat'). Omit to use user's default.
- `panel` (string): Panel slug to use (e.g., 'default', 'technology', 'healthcare'). Use 'auto' for automatic panel selection. Omit to use default panel.
- `query` (string, required): The question or decision to analyze
- `wait_seconds` (integer): Optional synchronous wait (0-90 seconds). Default 0 returns the session id immediately, avoiding reverse-proxy timeouts.

Output parameters:

- `text` (string)

### `list_panels` (~21 tokens)

List Panels

List all available expert panels with their descriptions and agent counts.

Output parameters:

- `text` (string)

### `list_agents` (~46 tokens)

List Agents

List all available expert agents with their roles, domains, and specialties.

Input parameters:

- `domain` (string): Filter agents by domain (e.g., 'finance', 'technology', 'healthcare')

Output parameters:

- `text` (string)

### `get_session` (~40 tokens)

Get Session

Get the full results of a previous Meta Council session, including all agent opinions and the synthesis.

Input parameters:

- `session_id` (string, required): The session ID to retrieve

Output parameters:

- `text` (string)

### `get_visualization` (~116 tokens)

Get Visualization

Fetch a chart artifact generated by a council session or LOCUS determination. Returns the machine-readable spec (the data behind the chart) plus the stable SVG URL, or the raw SVG itself with include_svg=true. Artifact ids appear in session results as 'visualizations' / 'visualization' reference blocks. Requires authentication and enforces the artifact owner's tenant boundary.

Input parameters:

- `artifact_id` (string, required): 32-hex artifact id from a visualization reference
- `include_svg` (boolean): Also return the full SVG markup (default false)

Output parameters:

- `text` (string)

### `list_workflows` (~47 tokens)

List Workflows

List available multi-step workflow pipelines (composable bundles that chain several steps, each able to run on its own model/provider). Returns each workflow's slug, description, and per-step model.

Output parameters:

- `text` (string)

### `run_workflow` (~154 tokens)

Run Workflow

Start a multi-step workflow pipeline and return its session id immediately by default. Poll get_workflow_session for each step's model/provider and output. synthesis. Steps run on YOUR configured provider keys, so a pipeline can chain models across providers. If a step is a human checkpoint, returns the session id to advance. Requires authentication.

Input parameters:

- `query` (string, required): The input to run the pipeline on. Be specific, e.g. 'Analyze NVDA as an investment'.
- `wait_seconds` (integer): Optional synchronous wait; default 0 returns immediately.
- `workflow` (string, required): The workflow slug (from list_workflows), e.g. 'live_market_pipeline', 'due_diligence', 'coding_tdd'.

Output parameters:

- `text` (string)

### `get_workflow_session` (~60 tokens)

Get Workflow Session

Poll a previously started workflow run for its current step-by-step status and output (useful when run_workflow timed out or is awaiting a checkpoint). Requires authentication.

Input parameters:

- `session_id` (string, required): The workflow session ID returned by run_workflow.

Output parameters:

- `text` (string)

### `recommend_panel` (~77 tokens)

Recommend Panel

Recommend the best expert panel for a query (semantic match with keyword fallback). Returns the top panel + confidence and the runner-up options — feed the result into run_council's panel argument. Requires authentication because the query may be sent to the configured embedding provider.

Input parameters:

- `query` (string, required): The question or decision to match to a panel.

Output parameters:

- `text` (string)

### `get_agent_detail` (~55 tokens)

Get Agent Detail

Full detail on one expert agent by slug (from list_agents): role, description, default model, domain, tags, and tools.

Input parameters:

- `slug` (string, required): The agent slug, e.g. 'safety_officer'.

Output parameters:

- `text` (string)

### `advance_workflow` (~94 tokens)

Advance Workflow

Advance a workflow past a human checkpoint — approve or reject the paused step so the pipeline continues. Use the session id from run_workflow / get_workflow_session. Requires authentication.

Input parameters:

- `action` (string, required): Explicit checkpoint decision: 'approve' or 'reject'.
- `notes` (string): Optional reviewer notes recorded with the decision.
- `session_id` (string, required): The workflow session id (must be awaiting a checkpoint).

Output parameters:

- `text` (string)

### `get_settings` (~44 tokens)

Get Settings

Get the authenticated user's Meta Council settings — preferred model, plan tier, and which provider/tool API keys are configured (booleans only, never the secret values). Requires authentication.

Output parameters:

- `text` (string)

### `list_outreach_campaigns` (~29 tokens)

List Outreach Campaigns

List the authenticated user's outreach campaigns with live lead / sent / reply counts. Requires authentication.

Output parameters:

- `text` (string)

### `search_outreach_leads` (~128 tokens)

Search Outreach Leads

Search the user's outreach leads — filter by a text query (company / contact / email), pipeline status, and/or campaign. Returns company, contact, status, pitch, and reply info. Requires authentication.

Input parameters:

- `campaign_id` (string): Filter to a single campaign id.
- `limit` (integer): Max leads to return (default 20, max 100).
- `search` (string): Text to match against company / contact name / title / email.
- `status` (string): Filter by pipeline status (e.g. 'ready', 'sent', 'replied').

Output parameters:

- `text` (string)

### `outreach_analytics` (~29 tokens)

Outreach Analytics

Outreach summary for the user — total leads, sent, replied, and reply rate. Requires authentication.

Output parameters:

- `text` (string)

### `score_locus_case` (~212 tokens)

Score Locus Case

Score an anonymized adult mental-health / addiction case against LOCUS. Convenes the LOCUS Assessment Panel (psychiatrist, addiction specialist, clinical social worker, utilization reviewer, peer specialist, safety officer); each reviewer independently rates all six LOCUS dimensions, then a DETERMINISTIC engine aggregates the ratings and applies the Determination Grid and the inviolable override floors IN CODE (safety floors like Risk-of-Harm=4 → Level 5 cannot be reasoned away). Returns the recommended Level of Care with a full audit trail. Adults only (CALOCUS/CASII covers child/adolescent); use ONLY anonymized cases. Starts asynchronously by default; poll get_session. Requires authentication.

Input parameters:

- `case` (string, required): The anonymized clinical case text (presentation, history, substance use, functional status, environment, engagement).
- `model` (string): Optional model override; omit for the platform default.
- `wait_seconds` (integer): Optional synchronous wait; default 0 returns immediately.

Output parameters:

- `text` (string)

### `locus_determine_from_scores` (~308 tokens)

Locus Determine From Scores

Compute a LOCUS Level of Care from dimension ratings you already have. Deterministic — no LLM, instant: composite + Determination Grid + the inviolable override floors (e.g. Risk-of-Harm=4 → minimum Level 5), applied in code. Provide EITHER the seven flat D* ratings (1-5 each; Dimension IV splits into IV-A Stress / IV-B Support) OR a per-reviewer agent_scores map. Requires authentication.

Input parameters:

- `D1_RiskOfHarm` (integer): Risk of Harm (1-5).
- `D2_FunctionalStatus` (integer): Functional Status (1-5).
- `D3_CoMorbidity` (integer): Medical/Addictive/Psychiatric Co-Morbidity (1-5). Capital M in CoMorbidity.
- `D4A_Stress` (integer): Recovery Environment — Stress (1-5).
- `D4B_Support` (integer): Recovery Environment — Support (1-5).
- `D5_TreatmentHistory` (integer): Treatment & Recovery History (1-5).
- `D6_Engagement` (integer): Engagement & Recovery Status (1-5).
- `agent_scores` (object): Per-reviewer scores keyed by reviewer name, aggregated by median. Shape: {"<reviewer>": {"D1_RiskOfHarm": 4, ...}}. Mutually exclusive with the flat D* fields.

Output parameters:

- `text` (string)

### `ask_legal` (~104 tokens)

Ask Legal

Research a U.S. federal and/or California legal question through the citation-grounded Themis corpus. The server controls whether the response is extractive or LLM-grounded; callers cannot enable paid generation. Returns source-linked research for informational use, not legal advice. Requires authentication.

Input parameters:

- `jurisdiction` (string): Corpus jurisdiction filter.
- `max_sections` (integer): Optional maximum number of supporting sections.
- `question` (string, required): Legal research question (no credentials or secrets).

Output parameters:

- `text` (string)

### `campaign_pipeline_stats` (~56 tokens)

Campaign Pipeline Stats

Pipeline-stage breakdown for one outreach campaign — total / sent / active / won / lost, reply rate, and per-stage lead counts. Requires authentication.

Input parameters:

- `campaign_id` (string, required): Campaign UUID (from list_outreach_campaigns).

Output parameters:

- `text` (string)

### `list_campaign_triggers` (~50 tokens)

List Campaign Triggers

List automation triggers (auto-reply rules, status updates, notifications) configured for an outreach campaign. Requires authentication.

Input parameters:

- `campaign_id` (string, required): Campaign UUID (from list_outreach_campaigns).

Output parameters:

- `text` (string)

### `list_campaign_replies` (~100 tokens)

List Campaign Replies

List sent / received emails for an outreach campaign, newest first — subject, body preview, and reply classification. Requires authentication.

Input parameters:

- `campaign_id` (string, required): Campaign UUID (from list_outreach_campaigns).
- `direction` (string): 'inbound' (replies from prospects — the default), 'outbound' (sent), or '' for all.
- `limit` (integer): Max rows (default 50, max 200).

Output parameters:

- `text` (string)

### `create_outreach_campaign` (~111 tokens)

Create Outreach Campaign

Create a new outreach campaign owned by the authenticated user. Returns the new campaign id. Reversible (campaigns can be edited/deleted in the dashboard). Requires authentication.

Input parameters:

- `description` (string): Optional description.
- `name` (string, required): Campaign name (required).
- `status` (string): Optional initial status: draft (default) | active | paused | completed.
- `target_audience` (string): Optional target-audience note.
- `target_segment` (string): Optional target segment label.

Output parameters:

- `text` (string)

### `add_outreach_lead` (~125 tokens)

Add Outreach Lead

Add a single lead to the authenticated user's outreach book. Returns the new lead id. Provenance is stamped source="agent" server-side. Does not send any email. Requires authentication.

Input parameters:

- `company` (string): Optional company name.
- `contact_name` (string): Optional contact full name.
- `contact_title` (string): Optional contact job title.
- `domain` (string): Optional company domain.
- `email` (string, required): Lead email address (required).
- `notes` (string): Optional free-text notes.
- `segment` (string): Optional segment label.

Output parameters:

- `text` (string)

### `assign_leads_to_campaign` (~85 tokens)

Assign Leads To Campaign

Assign one or more of the user's existing leads to one of the user's campaigns (both must be owned by the caller). Returns how many were assigned. Idempotent. Requires authentication.

Input parameters:

- `campaign_id` (string, required): Target campaign id (from list_outreach_campaigns).
- `lead_ids` (array, required): Lead ids to assign (from search_outreach_leads).

Output parameters:

- `text` (string)

### `update_outreach_lead_status` (~175 tokens)

Update Outreach Lead Status

Advance a lead through the pipeline — set its status / pipeline stage and, optionally, a recorded reply, pitch, or notes. The core pipeline-drive action. Idempotent (setting the same status twice is a no-op). Requires authentication.

Input parameters:

- `lead_id` (string, required): Lead id to update (from search_outreach_leads).
- `notes` (string): Optional free-text notes.
- `pitch_id` (string): Optional pitch id to attach to the lead.
- `response_text` (string): Optional recorded reply text.
- `response_type` (string): Optional reply classification (e.g. 'positive', 'negative', 'neutral').
- `status` (string): New pipeline status (e.g. 'ready', 'sent', 'replied', 'closed_won', 'closed_lost').

Output parameters:

- `text` (string)

### `draft_outreach_email` (~92 tokens)

Draft Outreach Email

Save a draft email subject and/or body onto one of the user's leads. This only stores the draft for human review — it does NOT send anything. A human sends from the dashboard. Requires authentication.

Input parameters:

- `email_body` (string): Draft email body.
- `lead_id` (string, required): Lead id to draft for (from search_outreach_leads).
- `subject_line` (string): Draft subject line.

Output parameters:

- `text` (string)

### `create_outreach_pitch` (~133 tokens)

Create Outreach Pitch

Create a reusable pitch template (subject + body templates, optional drafting prompt) owned by the user. Provenance is stamped source="agent" server-side. Returns the new pitch id. Requires authentication.

Input parameters:

- `body_template` (string, required): Email-body template (required).
- `category` (string): Optional category label.
- `name` (string, required): Pitch name (required).
- `prompt` (string): Optional AI drafting instruction.
- `subject_template` (string, required): Subject-line template (required).
- `target_segment` (string): Optional target segment label.
- `tone` (string): Optional tone (default 'professional').

Output parameters:

- `text` (string)

### `list_deals` (~78 tokens)

List Deals

List the caller's sales deals (newest first) together with a weighted pipeline forecast (open/weighted/won totals). Optionally filter by stage or lead_id. Deals are private to the API-key owner.

Input parameters:

- `lead_id` (string): Optional: only deals linked to this lead.
- `stage` (string): Optional stage filter.

Output parameters:

- `text` (string)

### `get_deal` (~48 tokens)

Get Deal

Fetch one of the caller's deals by id with its full activity timeline (notes, calls, meetings, emails, tasks; newest first).

Input parameters:

- `deal_id` (string, required): The deal id.

Output parameters:

- `text` (string)

### `list_sales_tasks` (~53 tokens)

List Sales Tasks

List the caller's open sales tasks (activities of type 'task' not yet done), bucketed overdue / today / upcoming and ordered most-urgent-first with per-bucket counts. Close one with complete_sales_task.

Output parameters:

- `text` (string)

### `get_sales_analytics` (~73 tokens)

Get Sales Analytics

Sales pipeline analytics for the caller: probability-weighted forecast, per-stage $ rollup, win rate (won / decided, by count and by value), average sales-cycle days over won deals, and open-deal aging with a stale count. Read-only; computed from the caller's own deals. Requires authentication.

Output parameters:

- `text` (string)

### `get_sales_recommendations` (~111 tokens)

Get Sales Recommendations

The caller's prioritized next-best sales actions: interested leads to convert, open deals gone stale enough to need a follow-up, and overdue tasks — each with a rationale and the exact governed tool to run next (convert_lead_to_deal / log_deal_activity / complete_sales_task) plus its arguments. Read-only; ranks the caller's own CRM data (overdue > convert > follow-up). Nothing is executed or sent — approve an item by calling the named write tool. Requires authentication.

Output parameters:

- `text` (string)

### `get_deal_health` (~134 tokens)

Get Deal Health

Health scores for the caller's OPEN deals: each scored 0-100 on how likely it is to be slipping (healthy >= 70 / watch / at_risk), worst first, with plain-language reasons — days since last logged contact, whether it is past its own expected close date, and how its age compares to the caller's average won-deal cycle. Includes per-band counts, an average score, and the reference cycle. Read-only and deterministic over the caller's own deals + activities; nothing is executed or sent. Pair with get_sales_recommendations to act on what is slipping. Requires authentication.

Output parameters:

- `text` (string)

### `create_deal` (~178 tokens)

Create Deal

Create a sales deal owned by the caller. Provide a title, or a lead_id to inherit the lead's company/name as the title. The deal appears live on the owner's Sales board. No deletes are exposed over MCP.

Input parameters:

- `amount` (number): Deal value (>= 0).
- `campaign_id` (string): Link to an owned campaign.
- `company` (string)
- `currency` (string): 3-letter ISO code (default USD).
- `expected_close_date` (string): ISO date YYYY-MM-DD.
- `lead_id` (string): Link to an existing owned lead.
- `notes` (string)
- `probability` (integer): Win probability 0-100.
- `stage` (string): Pipeline stage (default qualification).
- `title` (string): Deal title (required unless lead_id is given).

Output parameters:

- `text` (string)

### `update_deal` (~137 tokens)

Update Deal

Update one of the caller's deals — most commonly to ADVANCE its stage (e.g. discovery -> proposal). Moving to closed_won/closed_lost stamps the close date; reopening to an open stage clears it. Only the fields you pass change; deal_id is required.

Input parameters:

- `amount` (number)
- `company` (string)
- `currency` (string)
- `deal_id` (string, required)
- `expected_close_date` (string): ISO date YYYY-MM-DD.
- `notes` (string)
- `probability` (integer)
- `stage` (string)
- `title` (string)

Output parameters:

- `text` (string)

### `convert_lead_to_deal` (~126 tokens)

Convert Lead To Deal

Convert an owned outreach lead into a deal and advance the lead into the deal stage of the funnel (never downgrading an already-closed lead). Optional deal fields mirror create_deal; lead_id is required.

Input parameters:

- `amount` (number)
- `company` (string)
- `currency` (string)
- `expected_close_date` (string): ISO date YYYY-MM-DD.
- `lead_id` (string, required)
- `notes` (string)
- `probability` (integer)
- `stage` (string)
- `title` (string)

Output parameters:

- `text` (string)

### `log_deal_activity` (~172 tokens)

Log Deal Activity

Log an activity on a deal (or lead) — a note/call/meeting/email, or a follow-up task with a due date. Pass deal_id and/or lead_id (each must be owned by the caller). type defaults to 'note'; for a task set type='task' and a due_date (YYYY-MM-DD). Tasks appear in list_sales_tasks.

Input parameters:

- `body` (string)
- `deal_id` (string): Owned deal to attach to.
- `done` (boolean): Mark a task already done.
- `due_date` (string): ISO date YYYY-MM-DD (for tasks).
- `lead_id` (string): Owned lead to attach to.
- `subject` (string)
- `type` (string): note|call|meeting|email|task (default note).

Output parameters:

- `text` (string)

### `complete_sales_task` (~65 tokens)

Complete Sales Task

Mark one of the caller's sales tasks/activities done (or reopen it with done=false). Stamps or clears the completion time; activity_id is required.

Input parameters:

- `activity_id` (string, required)
- `done` (boolean): Default true (complete). Pass false to reopen.

Output parameters:

- `text` (string)

### `create_accounting_run` (~152 tokens)

Create Accounting Run

Analyze supported textual accounting records with the pinned deterministic Writeoff engine and create a private, encrypted audit run owned by the caller. Accepted filenames end in .txt, .md, .text, .eml, .csv, .ofx, .qfx, or .qif. Returns estimates for review only: it does not file taxes, move money, or send data to an external accounting service.

Input parameters:

- `context` (string): Optional business/tax context used by the deterministic engine.
- `documents` (array, required)
- `marginal_rate` (string): Optional decimal or percent, for example 0.24 or 24%.
- `name` (string): Optional private label for this audit run.

Output parameters:

- `text` (string)

### `list_accounting_runs` (~55 tokens)

List Accounting Runs

List only the caller's private Accounting-run audit metadata, newest first. Raw source text and analysis results are intentionally omitted.

Input parameters:

- `limit` (integer)
- `offset` (integer)
- `status` (string)

Output parameters:

- `text` (string)

### `get_accounting_run` (~74 tokens)

Get Accounting Run

Get one private Accounting run owned by the caller, including its deterministic estimates, disclaimer, engine revision, and audit timestamps. Source input stays omitted unless include_input=true is explicitly requested.

Input parameters:

- `include_input` (boolean): Also return the caller's decrypted source text; use sparingly.
- `run_id` (string, required)

Output parameters:

- `text` (string)

### `delete_accounting_run` (~53 tokens)

Delete Accounting Run

Permanently delete one private Accounting audit run owned by the caller. This is the only Accounting MCP deletion; it never files taxes, moves money, or contacts an external service.

Input parameters:

- `run_id` (string, required)

Output parameters:

- `text` (string)

### `preview_accounting_ticket_sync` (~122 tokens)

Preview Accounting Ticket Sync

Preview, without writing, how one completed owned Accounting run's WRITEOff work plan would map to stable Meta Council tickets. Reports creates, updates, unchanged tickets, human-edited generated fields that will be preserved, and identity conflicts. Requires both accounting:read and tickets:read; tickets:write also satisfies the ticket-read grant. Preview before committing because tickets are not field-encrypted; work-plan text may reproduce source-derived snippets or parser details, and after commit tickets:read can read it without accounting:read.

Input parameters:

- `run_id` (string, required)

Output parameters:

- `text` (string)

### `sync_accounting_tickets` (~158 tokens)

Sync Accounting Tickets

Commit a previously previewed completed Accounting run's WRITEOff work plan to stable owner-private Meta Council tickets. The expected_plan_hash from the preview is required, retries are idempotent, stable references prevent duplicate tickets across reprocessed runs, and human edits to generated content fields are preserved. Status, assignee, hierarchy, and completion are not reset. Requires both accounting:read and tickets:write. This creates or updates only in-platform planning tickets; they are not field-encrypted and become readable through tickets:read without accounting:read. It never files, pays, sends, or publishes anything.

Input parameters:

- `expected_plan_hash` (string, required): Exact plan_hash returned by preview_accounting_ticket_sync.
- `run_id` (string, required)

Output parameters:

- `text` (string)

### `ticket_plan` (~272 tokens)

Ticket Plan

Preview or idempotently commit an owner-private ticket tree generated from a planning prompt or supplied structured plan. Requires tickets:write. A preview without a supplied plan invokes the planner model and additionally requires councils:run; supplied-plan preview and commit are provider-free and need only tickets:write. Preview is non-mutating and returns the normalized commit payload, an exact preview_token, and deterministic predicted ticket IDs as JSON. To commit, combine that commit_payload with mode=commit, the caller-held idempotency_key, and that exact preview_token; the response returns the same IDs plus replay status. A caller-stable visible-ASCII idempotency_key is always required. This creates only in-platform planning tickets; it never runs them, sends, publishes, deletes, or changes an external provider.

Input parameters:

- `auto_assign` (boolean)
- `context` (string|null)
- `idempotency_key` (string, required): Caller-stable visible-ASCII key. Reuse only for the exact same operation and payload.
- `max_tickets` (integer)
- `mode` (string, required)
- `model` (string)
- `plan` (object)
- `preview_token` (string): Exact preview_token returned by preview mode.
- `prompt` (string, required)
- `session_id` (string|null)

Output parameters:

- `text` (string)

### `ticket_batch_create` (~213 tokens)

Ticket Batch Create

Preview or idempotently commit one atomic owner-private batch of structured tickets and nested subtickets. Preview is non-mutating and returns the normalized commit payload, exact preview_token, and deterministic predicted IDs as JSON. Commit requires that exact token: combine commit_payload with mode=commit, the caller-held idempotency_key, and preview_token. It returns the same IDs plus replay status. A caller-stable visible-ASCII idempotency_key is always required. MCP authorship is stamped by the server; callers cannot spoof it. Nested subtickets are bounded and validated by the ticket handler before any write. This never executes, sends, publishes, deletes, or mutates an external provider.

Input parameters:

- `idempotency_key` (string, required): Caller-stable visible-ASCII key. Reuse only for the exact same operation and payload.
- `mode` (string, required)
- `parent_id` (string|null)
- `preview_token` (string): Exact preview_token returned by preview mode.
- `tickets` (array, required)

Output parameters:

- `text` (string)

### `ticket_list` (~251 tokens)

Ticket List

Page through the caller's tickets on the Meta Council board. The opaque next_cursor is owner- and filter-bound; keep every filter unchanged on the next call. Immutable cursor ordering keeps a stable full-board traversal exact while returned tickets are edited or reordered. Filter by status, assignee, action_type, priority, parent_id (a ticket UUID, or 'none' for root tickets only), or free-text q over title/description. With recursive=true, parent_id must be an owned UUID and all descendants (not the anchor) are returned as one flat, cycle-safe traversal. Session/workflow links are opaque metadata filters, not access grants. Start here to find work, then use ticket_get for detail and ticket_claim to take a ticket.

Input parameters:

- `action_type` (string)
- `assignee` (string)
- `cursor` (string)
- `limit` (integer)
- `parent_id` (string): Parent ticket UUID, or 'none' for roots only.
- `priority` (string)
- `q` (string)
- `recursive` (boolean)
- `session_id` (string)
- `status` (string)
- `workflow_session_id` (string)

Output parameters:

- `text` (string)

### `ticket_get` (~44 tokens)

Ticket Get

Full detail for one owned ticket: description, acceptance criteria, subticket progress, and the recent activity/comment trail. ticket_id is required.

Input parameters:

- `ticket_id` (string, required)

Output parameters:

- `text` (string)

### `ticket_validation_finalize` (~180 tokens)

Ticket Validation Finalize

Finalize one immutable validation run for an exact owned ticket scenario revision. Requires the opt-in tickets:validate scope. The server derives owner and actor only from the authenticated API key. Evidence payloads are bounded opaque JSON objects; locator-looking strings are recorded but never opened, resolved, redirected, or fetched. Exact retries by the same credential actor return the original receipt; a changed actor or changed content under the same key conflicts.

Input parameters:

- `environment` (string, required)
- `evidence` (array, required)
- `idempotency_key` (string, required)
- `runner` (string, required)
- `scenario_hash` (string, required)
- `scenario_id` (string, required)
- `scenario_version` (integer, required)
- `source_revision` (string, required)
- `summary` (string|null)
- `ticket_id` (string, required)
- `verdict` (string, required)

Output parameters:

- `text` (string)

### `ticket_create` (~241 tokens)

Ticket Create

Create a ticket on the caller's board — optionally as a subticket via parent_id. Recommend degree of difficulty with effort (trivial|small|medium|large|epic) and the kind of work with action_type (strategy|implementation|research|validation|testing|coordination). The authenticated API-key UUID is stamped by the server as creator provenance; callers cannot supply or spoof it. Session/workflow ids are opaque metadata links only. New epics cannot be created already done.

Input parameters:

- `acceptance_criteria` (string)
- `action_type` (string)
- `assignee` (string)
- `description` (string)
- `effort` (string)
- `effort_points` (integer)
- `external_ref` (object)
- `labels` (array)
- `order_index` (integer)
- `parent_id` (string): Parent ticket UUID.
- `priority` (string)
- `session_id` (string)
- `status` (string): New epics cannot be created already done; task statuses use the lifecycle authority.
- `title` (string, required)
- `workflow_session_id` (string)

Output parameters:

- `text` (string)

### `ticket_update` (~314 tokens)

Ticket Update

Update fields on an owned ticket — status moves (each one is auto-logged to the ticket's audit trail), reassignment, priority/effort/action_type recommendations, title/description edits, safe reparenting, opaque session/workflow links, effort points, order, and user-owned external refs. Clear flags are explicit so stdio clients never lose JSON nulls. System-owned provider, Accounting, plan, and batch refs are preserved and cannot be spoofed. The authenticated API-key UUID is stamped on the audit trail. Epic completion and terminal reopen fail closed on this generic tool until an explicit lifecycle operation supplies retry/version evidence.

Input parameters:

- `acceptance_criteria` (string)
- `action_type` (string)
- `assignee` (string)
- `clear_effort_points` (boolean)
- `clear_parent` (boolean)
- `clear_session` (boolean)
- `clear_workflow_session` (boolean)
- `description` (string)
- `effort` (string)
- `effort_points` (integer)
- `external_ref` (object)
- `labels` (array)
- `order_index` (integer)
- `parent_id` (string)
- `priority` (string)
- `session_id` (string)
- `status` (string): Task moves are audited. Epic done or terminal reopen requires an explicit lifecycle operation with retry/version evidence.
- `ticket_id` (string, required)
- `title` (string)
- `workflow_session_id` (string)

Output parameters:

- `text` (string)

### `ticket_comment` (~73 tokens)

Ticket Comment

Add a comment to an owned ticket's activity trail. Use kind='progress' for work updates while a ticket is in progress. The authenticated API-key UUID is stamped as author; callers cannot supply or spoof it.

Input parameters:

- `body` (string, required)
- `kind` (string)
- `ticket_id` (string, required)

Output parameters:

- `text` (string)

### `ticket_claim` (~111 tokens)

Ticket Claim

Claim a ticket to work on: sets assignee to your agent name and moves it to in_progress in one step (the move is audit-logged). Refuses if another agent already has it in progress unless force=true. Follow up with ticket_comment progress updates and finish via ticket_update status='done'.

Input parameters:

- `assignee` (string, required): Your agent name, e.g. 'claude_code_local'.
- `force` (boolean): Take over a ticket another agent holds.
- `ticket_id` (string, required)

Output parameters:

- `text` (string)

### `submit_feedback` (~142 tokens)

Submit Feedback

Report direct product feedback to the Meta Council admins: a noticeable performance failure, a lacking/missing capability, a bug, or a UX/docs gap. Use it the moment a tool result, council run, or workflow falls short. Stored per-user and visible only to platform admins — the response returns an id + acknowledgement and submissions cannot be read back. Include machine context (tool name, session id, model) in the context object.

Input parameters:

- `body` (string)
- `category` (string)
- `context` (object): Machine context: tool name, session id, model, timings.
- `severity` (string)
- `title` (string, required)

Output parameters:

- `text` (string)

### `list_feedback` (~73 tokens)

List Feedback

ADMIN ONLY: list feature-feedback reports across all users for triage (requires an ADMIN_EMAILS account; everyone else gets a permission error). Filter by status, category, or severity.

Input parameters:

- `category` (string)
- `limit` (integer)
- `severity` (string)
- `status` (string)

Output parameters:

- `text` (string)

### `triage_feedback` (~88 tokens)

Triage Feedback

ADMIN ONLY: triage a feature-feedback report — set its status and/or admin notes (requires an ADMIN_EMAILS account; everyone else gets a permission error). Get the full feedback id from list_feedback.

Input parameters:

- `admin_notes` (string): Triage notes; an empty string clears them.
- `feedback_id` (string, required): Full feedback UUID from list_feedback.
- `status` (string)

Output parameters:

- `text` (string)

### `list_marketing_brands` (~21 tokens)

List Marketing Brands

List brand identities owned by the API-key account.

Output parameters:

- `text` (string)

### `get_marketing_brand` (~40 tokens)

Get Marketing Brand

Get one owned brand identity with its voice, value proposition, and guidelines.

Input parameters:

- `brand_id` (string, required): Full UUID from the matching list tool.

Output parameters:

- `text` (string)

### `list_marketing_audiences` (~23 tokens)

List Marketing Audiences

List reusable marketing audiences owned by the API-key account.

Output parameters:

- `text` (string)

### `get_marketing_audience` (~37 tokens)

Get Marketing Audience

Get one owned audience definition with pain points and channels.

Input parameters:

- `audience_id` (string, required): Full UUID from the matching list tool.

Output parameters:

- `text` (string)

### `list_marketing_campaigns` (~40 tokens)

List Marketing Campaigns

List owned marketing campaigns. These are separate from Sales outreach campaigns.

Input parameters:

- `include_archived` (boolean)
- `status` (string)

Output parameters:

- `text` (string)

### `get_marketing_campaign` (~41 tokens)

Get Marketing Campaign

Get one owned marketing campaign with its brand, audience, channels, and dates.

Input parameters:

- `campaign_id` (string, required): Full UUID from the matching list tool.

Output parameters:

- `text` (string)

### `list_content_assets` (~64 tokens)

List Content Assets

List owned content assets and immutable revisions; content is never published by this tool.

Input parameters:

- `approval_state` (string)
- `campaign_id` (string): Full UUID from the matching list tool.
- `include_archived` (boolean)
- `limit` (integer)

Output parameters:

- `text` (string)

### `get_content_asset` (~39 tokens)

Get Content Asset

Get one owned content revision, including its review state and exact content hashes.

Input parameters:

- `asset_id` (string, required): Full UUID from the matching list tool.

Output parameters:

- `text` (string)

### `get_content_calendar` (~43 tokens)

Get Content Calendar

List scheduled owned content between optional ISO-8601 boundaries. Scheduling is planning metadata, not publishing.

Input parameters:

- `end` (string)
- `start` (string)

Output parameters:

- `text` (string)

### `create_marketing_brand` (~53 tokens)

Create Marketing Brand

Create an owner-private brand identity. Requires marketing:agent_write.

Input parameters:

- `guidelines` (string)
- `name` (string, required)
- `value_proposition` (string)
- `voice` (string)

Output parameters:

- `text` (string)

### `update_marketing_brand` (~70 tokens)

Update Marketing Brand

Update fields on one owned brand identity. No delete is exposed over MCP.

Input parameters:

- `brand_id` (string, required): Full UUID from the matching list tool.
- `guidelines` (string)
- `name` (string)
- `value_proposition` (string)
- `voice` (string)

Output parameters:

- `text` (string)

### `create_marketing_audience` (~48 tokens)

Create Marketing Audience

Create an owner-private reusable audience definition.

Input parameters:

- `channels` (array)
- `description` (string)
- `name` (string, required)
- `pain_points` (string)

Output parameters:

- `text` (string)

### `update_marketing_audience` (~70 tokens)

Update Marketing Audience

Update fields on one owned audience definition. No delete is exposed over MCP.

Input parameters:

- `audience_id` (string, required): Full UUID from the matching list tool.
- `channels` (array)
- `description` (string)
- `name` (string)
- `pain_points` (string)

Output parameters:

- `text` (string)

### `create_marketing_campaign` (~99 tokens)

Create Marketing Campaign

Create an owner-private marketing campaign linked only to owned brand/audience ids.

Input parameters:

- `audience_id` (string): Full UUID from the matching list tool.
- `brand_id` (string): Full UUID from the matching list tool.
- `channels` (array)
- `ends_on` (string)
- `name` (string, required)
- `objective` (string)
- `starts_on` (string)
- `status` (string)

Output parameters:

- `text` (string)

### `update_marketing_campaign` (~111 tokens)

Update Marketing Campaign

Update one owned marketing campaign. Campaign status never publishes content.

Input parameters:

- `audience_id` (string): Full UUID from the matching list tool.
- `brand_id` (string): Full UUID from the matching list tool.
- `campaign_id` (string, required): Full UUID from the matching list tool.
- `channels` (array)
- `ends_on` (string)
- `name` (string)
- `objective` (string)
- `starts_on` (string)
- `status` (string)

Output parameters:

- `text` (string)

### `create_content_asset` (~83 tokens)

Create Content Asset

Create a private draft content asset. There is no publish/send operation.

Input parameters:

- `asset_type` (string)
- `campaign_id` (string, required): Full UUID from the matching list tool.
- `channel` (string)
- `content` (string, required)
- `revision_notes` (string)
- `scheduled_for` (string)
- `title` (string, required)

Output parameters:

- `text` (string)

### `update_content_asset` (~87 tokens)

Update Content Asset

Edit an owned draft. Submitted/approved/rejected revisions are immutable and must be revised.

Input parameters:

- `asset_id` (string, required): Full UUID from the matching list tool.
- `asset_type` (string)
- `channel` (string)
- `content` (string)
- `revision_notes` (string)
- `scheduled_for` (string)
- `title` (string)

Output parameters:

- `text` (string)

### `create_content_asset_revision` (~86 tokens)

Create Content Asset Revision

Create a new owned draft revision from a frozen submitted/approved/rejected revision.

Input parameters:

- `asset_id` (string, required): Full UUID from the matching list tool.
- `asset_type` (string)
- `channel` (string)
- `content` (string)
- `revision_notes` (string)
- `scheduled_for` (string)
- `title` (string)

Output parameters:

- `text` (string)

### `submit_content_asset` (~39 tokens)

Submit Content Asset

Submit an owned draft for review, freezing that exact revision and content hash.

Input parameters:

- `asset_id` (string, required): Full UUID from the matching list tool.

Output parameters:

- `text` (string)

### `approve_content_asset` (~55 tokens)

Approve Content Asset

Approve a submitted owned revision and attest to its exact content hash. Requires marketing:approve, separate from draft authority.

Input parameters:

- `asset_id` (string, required): Full UUID from the matching list tool.
- `notes` (string)

Output parameters:

- `text` (string)

### `reject_content_asset` (~46 tokens)

Reject Content Asset

Reject a submitted owned revision with optional reviewer notes. Requires marketing:approve.

Input parameters:

- `asset_id` (string, required): Full UUID from the matching list tool.
- `notes` (string)

Output parameters:

- `text` (string)

### `list_consulting_clients` (~35 tokens)

List Consulting Clients

List consulting clients owned by the API-key account.

Input parameters:

- `limit` (integer)
- `status` (string)

Output parameters:

- `text` (string)

### `create_consulting_client` (~70 tokens)

Create Consulting Client

Create an account-private consulting client.

Input parameters:

- `contact_email` (string)
- `contact_name` (string)
- `external_ref` (string)
- `name` (string, required)
- `notes` (string)
- `organization` (string)
- `status` (string)

Output parameters:

- `text` (string)

### `update_consulting_client` (~72 tokens)

Update Consulting Client

Update mutable fields on an owned consulting client.

Input parameters:

- `client_id` (string, required)
- `contact_email` (string)
- `contact_name` (string)
- `name` (string)
- `notes` (string)
- `organization` (string)
- `status` (string)

Output parameters:

- `text` (string)

### `list_consulting_engagements` (~45 tokens)

List Consulting Engagements

List consulting engagements owned by the API-key account.

Input parameters:

- `client_id` (string)
- `limit` (integer)
- `status` (string)

Output parameters:

- `text` (string)

### `create_consulting_engagement` (~94 tokens)

Create Consulting Engagement

Create an engagement for an owned consulting client.

Input parameters:

- `accounting_run_ref` (string)
- `client_id` (string, required)
- `external_ref` (string)
- `objective` (string)
- `sales_deal_ref` (string)
- `start_date` (string)
- `status` (string)
- `target_end_date` (string)
- `title` (string, required)

Output parameters:

- `text` (string)

### `update_consulting_engagement` (~94 tokens)

Update Consulting Engagement

Update mutable fields on an owned consulting engagement.

Input parameters:

- `accounting_run_ref` (string)
- `client_id` (string)
- `engagement_id` (string, required)
- `objective` (string)
- `sales_deal_ref` (string)
- `start_date` (string)
- `status` (string)
- `target_end_date` (string)
- `title` (string)

Output parameters:

- `text` (string)

### `get_consulting_engagement` (~43 tokens)

Get Consulting Engagement

Get one owned engagement with its document revisions, milestones, and internal deliverables. Long document bodies are previewed.

Input parameters:

- `engagement_id` (string, required)

Output parameters:

- `text` (string)

### `create_consulting_document_revision` (~64 tokens)

Create Consulting Document Revision

Create a revision-safe proposal or SOW draft on an owned engagement.

Input parameters:

- `body` (string, required)
- `engagement_id` (string, required)
- `expected_latest_revision` (integer)
- `kind` (string, required)
- `title` (string, required)

Output parameters:

- `text` (string)

### `update_consulting_document_revision` (~48 tokens)

Update Consulting Document Revision

Edit an unapproved proposal/SOW revision; approved revisions are immutable.

Input parameters:

- `body` (string)
- `document_id` (string, required)
- `title` (string)

Output parameters:

- `text` (string)

### `initialize_consulting_milestones` (~46 tokens)

Initialize Consulting Milestones

Idempotently initialize stable engagement milestones. Retries return the same ids and external refs.

Input parameters:

- `engagement_id` (string, required)
- `milestones` (array)

Output parameters:

- `text` (string)

### `update_consulting_milestone` (~77 tokens)

Update Consulting Milestone

Update an owned consulting milestone while preserving its stable ref.

Input parameters:

- `description` (string)
- `due_date` (string)
- `expected_version` (integer, required)
- `milestone_id` (string, required)
- `order_index` (integer)
- `status` (string)
- `title` (string)

Output parameters:

- `text` (string)

### `create_consulting_deliverable` (~69 tokens)

Create Consulting Deliverable

Create an internal draft deliverable on an owned engagement.

Input parameters:

- `description` (string)
- `due_date` (string)
- `engagement_id` (string, required)
- `key` (string, required)
- `milestone_id` (string)
- `title` (string, required)

Output parameters:

- `text` (string)

### `update_consulting_deliverable` (~66 tokens)

Update Consulting Deliverable

Edit an internal draft deliverable; review/approval state is separate.

Input parameters:

- `deliverable_id` (string, required)
- `description` (string)
- `due_date` (string)
- `milestone_id` (string)
- `title` (string)

Output parameters:

- `text` (string)

### `submit_consulting_deliverable` (~35 tokens)

Submit Consulting Deliverable

Submit an owned draft deliverable for internal review without publishing it.

Input parameters:

- `deliverable_id` (string, required)

Output parameters:

- `text` (string)

### `reopen_consulting_deliverable` (~34 tokens)

Reopen Consulting Deliverable

Return an unapproved review deliverable to editable draft status.

Input parameters:

- `deliverable_id` (string, required)

Output parameters:

- `text` (string)

### `approve_consulting_document_revision` (~62 tokens)

Approve Consulting Document Revision

Approve and lock one exact proposal/SOW revision. Requires the separate consulting:approve scope and never publishes or shares it.

Input parameters:

- `document_id` (string, required)
- `expected_content_hash` (string, required)
- `expected_version` (integer, required)

Output parameters:

- `text` (string)

### `approve_consulting_deliverable` (~63 tokens)

Approve Consulting Deliverable

Approve one submitted internal deliverable and record approver evidence. Requires consulting:approve and never publishes or sends it.

Input parameters:

- `deliverable_id` (string, required)
- `expected_content_hash` (string, required)
- `expected_version` (integer, required)

Output parameters:

- `text` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-meta-council-decision-intelligence/meta-council#diagnostics

## Score history

- 2026-08-03: 77
- 2026-08-02: 76
- 2026-08-01: 76
- 2026-07-31: 75
- 2026-07-30: 70
- 2026-07-29: 68
- 2026-07-28: 69
- 2026-07-27: 68
- 2026-07-26: 67

## Links

- Remote endpoint: https://meta-council.com/mcp
- Authorisation metadata: https://meta-council.com/.well-known/oauth-protected-resource/mcp
- Repository: https://github.com/daliu/meta-council
- Changelog RSS feed: https://verifymcp.io/servers/com-meta-council-decision-intelligence/meta-council/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-meta-council-decision-intelligence/meta-council/changelog.json
- HTML version of this page: https://verifymcp.io/servers/com-meta-council-decision-intelligence/meta-council
