Documentation
Everything you need to run your first council, customize panels, build workflows, and integrate via the API.
Getting Started
Run your first council query in under a minute. No setup required.
-
Type your question
Enter any high-stakes question into the query box on the home page. Be specific: include context, constraints, and what kind of recommendation you need. For example: "Should we migrate our monolith to microservices given a 6-person engineering team and $2M ARR?"
-
Choose a panel
Select a panel of expert agents from the dropdown. Each panel is a curated group of AI specialists tuned for a specific domain. The Default Panel (Strategist, Risk Analyst, Devil's Advocate) works for most general questions. Pick a specialized panel for domain-specific queries.
-
Review the results
Each agent delivers an independent analysis with a recommendation, confidence score, key considerations, and risks. A synthesis step combines all opinions into a single decision document with an executive summary, action plan, and risk matrix. Expand any agent card to see their full reasoning.
Panels
A panel is a curated group of expert AI agents that deliberate on your query in parallel. Each panel is designed for a specific domain or decision type.
How panels work
When you run a council, every agent on the selected panel independently analyzes your query using their unique expertise, analytical framework, and persona. Each agent has a weight that determines how much influence they have on the final synthesis. Some agents are marked required, meaning they always participate and may hold veto authority (for example, the Safety Officer).
Available panels
Fast 3-agent council for general business decisions. Strategist, Risk Analyst, Devil's Advocate.
The fastest council -- 2 agents for a rapid decision gut-check with red-teaming.
The most comprehensive council with 8 expert agents for high-stakes decisions.
Architecture, tech stack, build-vs-buy, technical debt. Architect, TDD Engineer, DevOps, Security, PM, QA.
Roadmap, pricing, go-to-market. Product Manager, UX Researcher, Data Scientist, Marketing, Sales.
Clinical decision support with Attending Surgeon, Clinical Pharmacist, and specialist agents.
Drug development, clinical trials, regulatory submissions. 7 specialists from trials to post-market.
Strategic military advisory using ranked authority. Strategist, Intelligence Analyst, and doctrine frameworks.
Deal strategy, pipeline, pricing, competitive positioning. Sales Director, Engineer, Negotiation Expert.
Infrastructure, security, and operations. IT Director, Cybersecurity, DevOps/SRE, Network, DR, Risk.
Holistic financial planning: tax, investment, risk, legal, and behavioral perspectives.
Stress-test a new venture from five angles: VC, Marketing, Legal, Technical, and Financial.
Investment analysis from multiple professional disciplines for rigorous investment theses.
Multi-perspective policy analysis with equally weighted conservative, progressive, and economist viewpoints.
Rapid-response council for active or imminent organizational crises requiring decisive action.
Production and operations advisory. Systems Engineer, QA Manager, and process specialists.
Technology strategy with Systems Engineer, CISO, and senior technical leadership.
Full-spectrum advisory for large-scale conferences, festivals, galas, and corporate events.
Franchise decisions, player acquisition, contract negotiations using analytical frameworks.
Sustainable food product strategy from farm to consumer. Agricultural, culinary, and market perspectives.
Plus specialized geopolitical scenario panels. New panels are added regularly.
Workflows
Workflows are multi-step decision pipelines with human review between each stage. Unlike a single council query, workflows chain multiple councils together in a structured sequence.
Councils vs. workflows
A council is a single round of multi-expert deliberation: you ask a question, agents analyze it in parallel, and a synthesis combines their opinions. A workflow is a sequence of councils and processing steps that tackle a complex process end-to-end.
For example, a "Due Diligence" workflow might run four stages: financial analysis, legal review, technical assessment, and a final synthesis. Each stage can use a different panel, and you can review and refine between stages.
When to use workflows
Use a workflow when your decision requires multiple phases that build on each other, when you need human review checkpoints, or when the process is standardized enough to template. Examples:
- Product launch planning (market analysis, technical feasibility, go-to-market)
- Incident postmortem (timeline, root cause, remediation, prevention)
- TDD development (requirements, test design, implementation, review)
- RFP response (requirements parsing, solution design, pricing, final assembly)
Running a workflow
Select the "Workflows" tab in the main interface. Browse available templates, pick one, and fill in your context. The workflow guides you through each stage, showing progress and letting you adjust inputs between steps.
Custom Agents
Create expert agents tailored to your organization's specific domain knowledge and decision-making needs.
What defines an agent
Every agent is a Markdown template with YAML frontmatter. The frontmatter defines metadata (name, role, expertise tags, default weight), and the body is a system prompt that shapes the agent's persona, analytical framework, and output style.
Creating a custom agent
In the web interface, go to the Agents page and click "Create Agent." You can define:
- Name and role -- The agent's title and professional identity
- Expertise -- Domain tags that help match agents to queries
- Analytical framework -- The step-by-step methodology the agent follows
- Decision criteria -- What the agent optimizes for (safety, ROI, speed, etc.)
- Weight -- How much influence this agent has in the synthesis (default 1.0)
- Model -- Optionally override which LLM this agent uses
Sharing and forking
Agents can be shared via the marketplace. You can fork any public agent, customize it, and add it to your panels. All agents support version tracking.
API Reference
Integrate Meta Council into your existing tools and workflows with the REST API. All endpoints accept and return JSON.
Base URL
All paths below are relative to this base. The Developer API (v1) uses /api/v1 instead.
Authentication
Two methods are supported, but they are scoped to different endpoint families and are not interchangeable on the same request:
| Method | How to obtain | Header format | Used for |
|---|---|---|---|
| JWT token | POST /api/auth/login with email + password |
Authorization: Bearer <jwt_token> |
Everything under /api/* except /api/v1/* — and also the /api/v1/keys key-management endpoints themselves |
| API key | Settings > Developer API in the web UI, or POST /api/v1/keys |
Authorization: Bearer mc_<key> |
Only /api/v1/* endpoints — except /api/v1/keys, which requires the JWT |
API keys use the mc_ prefix and are shown only once at creation time. Store them securely.
Rate limits
| Tier | Council runs / hour |
|---|---|
| Free | 3 |
| Pro | 20 |
| Enterprise | 200 |
Council runs are also capped per day: 5/day on Free, 50/day on Pro, 2,000/day on Enterprise. Requests to /api/v1/* endpoints share a flat 120 requests/minute limit per API key, applied identically across all tiers (configurable via API_KEY_RATE_PER_MIN on self-hosted deployments). A few specific endpoints carry small fixed per-IP limits regardless of tier: POST /api/council/run 10/min, file upload 3/min, Laws & Regulations research 5/min, workflow goal-parse 10/min, workflow start 5/min, registration 10/hour. Ticket-validation ingestion independently limits source-IP and authenticated-actor attempts to 60/min by default (self-hosted setting TICKET_VALIDATION_ATTEMPTS_PER_MIN). Most other endpoints have no explicit rate limit.
When you exceed a limit, the response is 429 Too Many Requests with a Retry-After header giving the number of seconds to wait before retrying.
Response format
All responses are JSON. Successful responses return a top-level object. Errors return {"detail": "error message"} with an appropriate HTTP status code. See Error Handling below.
Council API
The core product. Start a multi-expert council session, poll for results, and retrieve agent/panel metadata.
POST
/api/council/run
Start a new council session. Agents analyze your query in parallel, then a synthesis step combines their outputs. Returns immediately with a session ID for polling.
Request body| Field | Type | Required | Description |
|---|---|---|---|
query | string | Yes | The question or decision to deliberate on. Be specific: include context, constraints, and desired output. |
panel | string | No | Panel slug. Defaults to "default". "auto" and "dynamic" are aliases for the same tier-aware auto-selection: Free-tier requests get an embedding-matched pre-built panel; Pro/Enterprise requests get an MMR-curated custom panel drawn from all agents (recorded in the session as panel_slug: "auto" either way). See GET /api/panels for pre-built panel slugs. |
model_override | string | No | Override the model for all agents in this run (e.g. "claude-sonnet-4-6", "gpt-4o"). Applied best-effort: you must be authenticated (a valid JWT, not an API key, on this endpoint) and have a matching provider API key saved under Settings. If either is missing, the override is silently ignored — every agent and the synthesis step run on the current platform default model instead, the request still returns 200, and no response field flags the fallback. Compare agents[*].model in the completed session against the model you requested to detect it. |
council_id | string | No | ID of a saved custom council to run instead of a named panel. Takes precedence over panel. |
is_private | boolean | No | Authenticated JWT runs default to true and are restricted to the owning account and authorized administrators. Set false only to explicitly publish non-confidential content. Guest runs are always public, even if this field is supplied as true. |
| Field | Type | Description |
|---|---|---|
session_id | string | Unique session identifier. Use this to poll for results. |
status | string | Always "running" on initial response. |
GET
/api/council/sessions/{session_id}
Poll a running session for status updates and results. Call this every 1-3 seconds until status is "completed" or "failed".
| Status | Meaning |
|---|---|
running | Agents are analyzing the query in parallel. The agents object shows per-agent progress. |
synthesizing | All agents finished. The synthesis model is combining results into a unified recommendation. |
completed | Done. The synthesis and agents fields contain full results. |
failed | An error occurred. Check the error field for details. |
| Field | Type | Description |
|---|---|---|
session_id | string | Session identifier. |
status | string | One of: running, synthesizing, completed, failed. |
query | string | The original query submitted. |
panel | string | Panel slug used for this session. |
synthesis | object | The combined recommendation (see Synthesis object below). Only present when status is "completed". |
agents | object | Map of agent name to agent result object (see Agent object below). |
duration | number | Total session duration in seconds. |
| Field | Type | Description |
|---|---|---|
executive_summary | string | 2-3 paragraph summary of the recommendation with the key decision and reasoning. |
detailed_analysis | string | Full analysis combining all agent perspectives, typically 500-2000 words. |
consensus_points | string[] | Points where the majority of agents agree. |
dissenting_views | string[] | Notable disagreements or minority opinions from specific agents. |
risk_matrix | object[] | Array of risks, each with description, likelihood (low/medium/high), impact (low/medium/high), raised_by (who flagged it), and mitigation. |
recommended_action | string | Clear, actionable next steps based on the council's combined analysis. |
| Field | Type | Description |
|---|---|---|
name | string | Display name of the agent (e.g. "Chief Strategist"). |
role | string | Agent's professional role and perspective. |
model | string | LLM model used for this agent's analysis. |
weight | number | Agent's influence weight in the synthesis (typically 1.0, safety_officer is 2.0). |
status | string | "running", "completed", or "failed". |
recommendation | string | The agent's recommendation (e.g. "PROCEED WITH CONDITIONS"). |
confidence | number | Confidence score from 0.0 to 1.0. |
reasoning | string | Detailed analysis and reasoning behind the recommendation. |
key_considerations | string[] | Most important factors the agent weighed. |
risks | string[] | Risks identified by this agent. |
dissenting_points | string[] | Points where this agent disagrees with the likely consensus. |
duration | number | Time in seconds this agent took to respond. |
tokens | number | Total tokens used by this agent (prompt + completion). |
GET
/api/panels
List all available panels with their agent compositions, descriptions, and metadata. Use the returned slugs as the panel parameter in POST /api/council/run.
GET
/api/agents
List all 290+ available agents with their metadata, expertise tags, default weights, and descriptions. Useful for building custom panels or understanding which specialists are available.
GET
/api/council/platform-status
Check the current default model being used by the platform. Returns the active model name and whether the platform is using the primary model or a fallback.
GET
/api/council/model-specs
Get context window sizes for all supported models. Useful for determining which models fit your query length requirements.
Workflow API
Multi-step decision pipelines with human checkpoints. Chain multiple council sessions together in a structured sequence.
GET
/api/workflows/templates
List all available workflow templates (built-in and custom). Returns template name, slug, description, step count, and domain for each.
GET
/api/workflows/templates/{slug}
Get full details for a specific workflow template, including all steps, the agent template used per step, and example queries.
POST
/api/workflows/start
Start a new workflow session from a template. The first step begins immediately. Use the returned session ID to poll for progress and advance through checkpoints.
Request body| Field | Type | Required | Description |
|---|---|---|---|
workflow | string | Yes | Workflow template slug (e.g. "due_diligence", "coding_tdd"). |
query | string | Yes | User-provided context and goal for the workflow. This is injected into every step. |
step_models | object | No | Optional per-step model overrides, keyed by step index as a string (e.g. {"0": "claude-sonnet-4-6", "2": "gpt-4o"}). Each model id is validated against the platform's model catalog — unknown ids or out-of-range indices return 400. Retargets individual steps; does not apply one model to every step. |
GET
/api/workflows/sessions/{session_id}
Poll a workflow session for status. Returns current step, completed step results, and whether a human checkpoint is pending approval.
POST
/api/workflows/sessions/{session_id}/advance
Approve or reject a checkpoint in a workflow. When a step completes, the workflow pauses at a checkpoint for human review. Call this to advance to the next step or reject and re-run the current step with adjusted context.
Request body| Field | Type | Required | Description |
|---|---|---|---|
action | string | Yes | "approve" to advance to the next step, or "reject" to re-run the current step. |
human_notes | string | No | Optional feedback or adjusted context. Injected into the next step's prompt. |
POST
/api/workflows/parse-goal
Submit a natural language goal and get a recommended workflow template match. Useful for building chat-style interfaces where users describe what they want to accomplish.
Request body| Field | Type | Required | Description |
|---|---|---|---|
goal | string | Yes | Natural language description of what the user wants to accomplish. |
POST
/api/workflows/templates
Create a custom workflow template. Define the steps, panels, checkpoint rules, and context injection for each stage. The template's slug is derived automatically from name (server-side slugify) and returned in the response — it is not an input field. Available on any authenticated tier, up to 50 custom templates per account; scheduling (POST /schedules) and publishing to the public gallery (POST /templates/{slug}/publish) require Pro or Enterprise.
PUT
/api/workflows/templates/{slug}
Update an existing custom workflow template. You can only update templates you own.
DELETE
/api/workflows/templates/{slug}
Delete a custom workflow template. Built-in templates cannot be deleted.
Workflow Schedules API
Schedule workflows to run automatically on a recurring basis. Useful for periodic reviews, monitoring, and automated reporting.
GET
/api/workflows/schedules
List all your workflow schedules with their configuration, next run time, and status.
POST
/api/workflows/schedules
Create a new workflow schedule. Specify the workflow, query, and recurrence (frequency, day, hour, timezone) for execution. New schedules are always created active; to create a disabled one, create it first and then call PUT /api/workflows/schedules/{schedule_id} with "is_active": false.
| Field | Type | Required | Description |
|---|---|---|---|
workflow_slug | string | Yes | Workflow template to execute on schedule. |
query | string | Yes | Query/context passed to the workflow on each run. |
frequency | string | No | One of "daily", "weekly", "monthly". Default: "weekly". |
day_of_week | integer | No | 0 (Mon) to 6 (Sun) for weekly schedules; day of month (clamped 1–28) for monthly. Default: 1. |
hour | integer | No | Hour of day, 0–23, in the schedule's timezone. Default: 9. |
timezone | string | No | IANA timezone name. Default: "America/Los_Angeles". |
PUT
/api/workflows/schedules/{schedule_id}
Update an existing workflow schedule. Change the query, frequency/day_of_week/hour/timezone, or enable/disable it.
DELETE
/api/workflows/schedules/{schedule_id}
Delete a workflow schedule. Any currently running instance will complete, but no new runs will be triggered.
History & Sharing
Access past council sessions and their full results. Public sessions are accessible at /s/{session_id} in the browser.
GET
/api/history
List your past council sessions with metadata (query, panel, timestamp, status), most recent first. Histories are private: each account sees only its own sessions, and unauthenticated calls return an empty list. Returns a fixed window of your 50 most recent sessions, with no limit/offset/page/cursor parameters.
GET
/api/history/{session_id}
Get the full results of a past session -- the same data that powers the /s/{session_id} shareable link. Includes the complete synthesis, all agent results, and metadata.
Settings & Keys
Manage your account settings, provider API keys, model preferences, and developer API keys.
GET
/api/settings
Get your current settings including configured provider API keys (masked) and default model preference. Synthesis strategy is served separately via GET /api/synthesis-strategy.
PUT
/api/settings
Update your settings. Set provider API keys (Anthropic, OpenAI, Google, etc.), default model, and other preferences. Keys are stored encrypted.
POST
/api/v1/keys
Generate a scoped developer API key with a 1–365 day lifetime (90 days by default). Requires JWT auth (not API key auth). The key is returned once and cannot be retrieved again -- store it immediately.
Request body| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | A descriptive name for the key (e.g. "Production server", "CI pipeline"). Defaults to "Default" if omitted. |
scopes | string[] | No | Least-privilege grants. The default includes catalog, council, and workflow read/run access but excludes clinical, Laws & Regulations (legal:run), Accounting, Marketing, Consulting, approval, settings, outreach, and tickets:validate scopes. |
expires_in_days | integer | No | 1–365; defaults to 90. |
GET
/api/v1/keys
List your developer API keys. Returns key ID, name, creation date, and last-used timestamp. The full key is not returned (only the prefix).
Developer API (v1)
A simplified interface for programmatic access. Uses the /api/v1/ prefix with API key authentication for every endpoint except key management (create/list/revoke), which requires your account JWT. Designed for integrations, automation pipelines, and AI agent toolchains.
Authorization: Bearer mc_<your_key>. The three key-management endpoints — POST /api/v1/keys, GET /api/v1/keys, DELETE /api/v1/keys/{key_id} — are the exception: they require your account JWT (Authorization: Bearer <jwt_token>), not an mc_ API key.
Endpoint summary
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/councils/run |
Start a council query via API key auth. Unlike /api/council/run, v1 sessions are always private (is_private cannot be overridden) and council_id is not supported — only a named panel slug can be used. |
| GET | /api/v1/councils/sessions/{id} |
Poll session status and retrieve full results. |
| POST | /api/v1/query |
Runs the real council and waits up to wait_seconds (default/max 90). Returns results inline if complete, otherwise a real job_id to poll. |
| POST | /api/v1/query/async |
Starts the real council pipeline and returns its owner-scoped session as job_id. Poll with GET /api/v1/query/{job_id}. |
| GET | /api/v1/query/{job_id} |
Get results for an async query job. |
| GET | /api/v1/agents |
List all available agents with metadata and expertise tags. |
| GET | /api/v1/agents/{slug} |
Get detailed info for a specific agent. |
| GET | /api/v1/panels |
List all available panels with agent counts and descriptions. |
| GET | /api/v1/settings |
Get your account settings. |
| PUT | /api/v1/settings |
Update provider API keys and model preferences. |
| POST | /api/v1/keys |
Create a new API key (requires JWT auth). |
| GET | /api/v1/keys |
List your API keys (requires JWT auth). |
| DELETE | /api/v1/keys/{key_id} |
Revoke an API key (requires JWT auth). |
Quick start: end-to-end cURL example
Request body: /api/v1/councils/run
| Field | Type | Required | Description |
|---|---|---|---|
query |
string | Yes | The question or decision to deliberate on. |
panel |
string | No | Panel slug (default: "default"). "auto" and "dynamic" currently resolve identically and are gated purely by account tier, not by which literal you pass: Pro/Enterprise accounts get MMR-based dynamic agent matching across all agents; Free accounts get the best pre-built panel match instead, with no error or notice. |
model |
string | No | Override the model for all agents in this run (requires matching API key in settings). |
is_private |
boolean | N/A | Not currently accepted by this endpoint. Every session created via POST /api/v1/councils/run is always private (the server hardcodes is_private=True); there is no way to make a v1-created session public via the request body. |
Session status values
| Status | Meaning |
|---|---|
running | Agents are analyzing the query in parallel. |
synthesizing | All agents finished; the synthesis step is combining results. |
completed | Done. The synthesis and agents fields contain full results. |
failed | An error occurred. Check the error field. |
MCP Server
Use Meta Council as a tool from Claude Code, Cursor, Windsurf, or any MCP-compatible AI agent.
The hosted MCP source candidate defines 108 tools for councils, workflows, catalog discovery, deterministic LOCUS calculation, citation-grounded Laws & Regulations research, settings reads, governed Sales/outreach, the private ticket board, feature feedback, and owner-private Accounting, Invoicing, Marketing, and Consulting workspaces. The current repository transport identifies as server 2.5.0; that version and this tool count are source facts, and neither by itself proves what production currently serves — an endpoint one release behind serves the previous count. Ticket planning and atomic batch tools use preview tokens, caller-stable idempotency keys, and deterministic IDs so uncertain commit retries cannot duplicate a tree. Separately scoped ticket validation records immutable evidence-backed results without fetching evidence locators or echoing evidence payloads. Accounting runs deterministic analysis with encrypted audit records and explicit stable-ticket preview/commit; it never files, pays, or sends externally. Marketing covers brands, audiences, campaigns, immutable content revisions, a planning calendar, draft submission, and separately scoped approval. Consulting covers clients, engagements, revision-safe proposals and SOWs, milestones, and internal deliverables with independent approval. None of these workspaces publishes, shares, sends, or deletes beyond its explicit private lifecycle controls. Long-running tools start asynchronously and return a session ID to poll. Authenticated sessions, audit runs, and artifacts are private by default.
Hosted Streamable HTTP
The hosted endpoint uses scoped, expiring developer keys. Four catalog tools (list_panels, list_agents, list_workflows, and get_agent_detail) are anonymous; every query-bearing, tenant-bearing, clinical, Laws & Regulations, Accounting, Marketing, Consulting, ticketing, settings, or outreach operation requires the relevant scope. MCP OAuth is not implemented yet, so clients that require OAuth account linking need a compatible HTTP-to-stdio bridge.
The hosted server is active in the official MCP Registry as com.meta-council/decision-intelligence version 1.4.0. Configure the URL and scoped key explicitly because the listing does not provision credentials.
Common MCP tools
| Tool | Description |
|---|---|
run_council | Start a private council run and return a session ID to poll. |
run_workflow | Run a multi-step workflow pipeline end to end, feeding each step's output into the next. |
list_workflows | List available workflow pipelines (due diligence, market intelligence, coding, and more). |
advance_workflow | Advance a workflow past a human checkpoint (approve or reject the current step). |
get_workflow_session | Get the step-by-step state of a running or finished workflow. |
score_locus_case | Score an adult mental-health / addiction case against the LOCUS level-of-care framework. |
locus_determine_from_scores | Compute a LOCUS Level of Care from dimension ratings you already have (deterministic, no LLM). |
ask_legal | Run fixed Themis retrieval and attach a proposed agent/source/synthesis plan whose routes remain planned_not_run; requires legal:run and provides research only, with no legal advice or decision authority. |
list_panels | List available panels with descriptions. |
list_agents | List available agents with expertise tags. |
recommend_panel | AI-powered panel recommendation for a given query. |
get_session | Retrieve results from a past session. |
get_visualization | Retrieve an owner-authorized chart artifact; it is not a public bearer link. |
get_agent_detail | Get full details for a specific agent. |
get_settings | View current account settings. |
get_deal_health | Score the caller's open deals for staleness, overdue work, missing next steps, and close-date risk. Requires outreach:read. |
Laws & Regulations: agent-first research
The product surface is Laws & Regulations. The stable MCP tool remains ask_legal and requires legal:run. The equivalent REST routes remain POST /api/legal/plan for a deterministic provider-free proposed plan and POST /api/legal/ask for fixed Themis retrieval with that unexecuted plan attached. The plan's agent, model/effort, source, and synthesis routes report planned_not_run; the planner does not execute them.
| Input | Accepted value | Purpose |
|---|---|---|
question | string, required | Bounded laws or regulations research question; never include credentials or secrets. |
context | string, default empty | Optional factual context, treated as supplied and unverified. |
jurisdiction | auto, federal, california, or both | Supported corpus filter; unresolved local or other jurisdiction facts remain visible. |
max_sections | integer 1–20, optional | Bounds supporting sections. |
research_mode | check_law or themis | Check the law (check_law) is fixed source-first retrieval; See what Themis says (themis) explicitly requests fail-closed neutral generation. |
quality | fast, balanced, or deep | Changes the proposed, unexecuted model-quality and reasoning-effort routes; default balanced. It is not a confidence score. |
domains | string[], up to 8 | Optional hints such as osha, building_codes, or sports_regulation. |
requested_agents | string[], up to 7 | Catalog additions to the proposed specialist set; the baseline agent reserves one of eight total slots. |
model_overrides | object, up to 8 entries | Agent-slug to catalog model-ID overrides for proposed, unexecuted routes. |
reasoning_effort_overrides | object, up to 8 entries | Agent-slug to low, medium, high, or max overrides for proposed, unexecuted routes. |
See what Themis says (research_mode: "themis") requires a signed-in user, the exact operator capability THEMIS_NEUTRAL_SCHEMA_VERSION=themis_neutral_research/v1, the LEGAL_ALLOW_LLM gate, and an atomic reservation from the finite daily spend breaker. Themis must return that exact neutral evidence schema: provider assertions contain only IDs, enumerated kind/topic codes, and evidence IDs; gaps are enum codes. The server expands fixed neutral templates, and every referenced quote must be verified. Missing capability or policy admission fails with 503; free-form or otherwise nonconforming generated material fails with 502 and is withheld. A valid extractive fallback is labeled check_law with a degradation_reason. Legacy verdict and answer_text prose is never exposed.
The result includes bounded source/citation records and evidence_graph (legal_evidence_graph/v1), whose assertions link to evidence IDs and whose gaps preserve missing or unverified support. It also adds workflow_plan (proposed domains/jurisdictions, agents, model/effort routing, source checks, and neutral synthesis constraints, all unexecuted), research_metadata (requested/effective mode, quality, degradation, and corpus_status), and platform_disclaimer. If no valid corpus-update timestamp is reported, freshness is not_reported and must be treated as unknown—not inferred from deployment time or model confidence.
Accounting: private deterministic audit runs and stable tickets
Six owner-scoped tools analyze supported textual records, retain an encrypted audit trail, and explicitly preview/commit dollar-free work-plan projections onto the private ticket board. Grant accounting:read for list/get, accounting:write for create/delete, and combine accounting:read with tickets:read for preview or tickets:write for commit. These grants never appear on default or legacy keys.
| Tool | Description |
|---|---|
create_accounting_run | Analyze 1–50 textual .txt, .md, .text, .eml, .csv, .ofx, .qfx, or .qif records and save an encrypted run. Requires accounting:write. |
list_accounting_runs | List only your audit metadata; raw input and results stay omitted. Requires accounting:read. |
get_accounting_run | Get one owned run's deterministic estimates, professional-review disclaimer, engine revision, and timestamps. Decrypted input is opt-in. Requires accounting:read. |
delete_accounting_run | Permanently delete one Accounting audit run you own. Requires accounting:write. |
preview_accounting_ticket_sync | Preview stable-ticket creates, updates, preserved edits to generated content fields, and conflicts without writing. Requires accounting:read plus tickets:read; tickets:write satisfies ticket read. |
sync_accounting_tickets | Idempotently commit the exact preview using its required expected_plan_hash. Requires accounting:read plus tickets:write. |
tickets:read, even without accounting:read. Sync uses the encrypted run's immutable source/item/rule identity rather than WRITEOff's positional ID or visible merchant target; runs created before that contract must be reprocessed. Human edits to generated content fields remain authoritative, and sync never resets status, assignee, hierarchy, or completion; accounting_run and workflow_session_id are system-owned newest-linked-run mirrors. Confirm every result with a qualified tax professional.Outreach: read the pipeline
Six read tools let an agent inspect your sales pipeline. All require the outreach:read scope and are strictly scoped to your own campaigns and leads.
| Tool | Description |
|---|---|
list_outreach_campaigns | List your campaigns with live lead / sent / reply counts. |
search_outreach_leads | Search your leads by text, pipeline status, and/or campaign. |
outreach_analytics | Totals across your book — leads, sent, replied, reply rate. |
campaign_pipeline_stats | Per-stage breakdown for one campaign (total / sent / won / lost). |
list_campaign_triggers | List a campaign's automation triggers. |
list_campaign_replies | List a campaign's sent / received emails, newest first. |
Outreach: drive the pipeline (governed writes)
Six write tools let an agent move the pipeline forward — create a campaign, add and organize leads, advance a lead's status, and draft copy. They all require the dedicated outreach:agent_write scope and are governed by design:
- Least-privilege scope. These tools use
outreach:agent_write, a scope that is deliberately narrower thanoutreach:write: a key granted onlyoutreach:agent_writecan drive the pipeline through MCP but cannot call the REST live-send or delete endpoints (those still require the broaderoutreach:write). Grant your agent this scope alone to keep sending and deletion off the table entirely. A fulloutreach:writekey remains a superset and also works. - Auth-gated & user-scoped. Every write is filtered by your user id / campaign owner id — an agent can only touch your own campaigns, leads, and pitches.
- Honest provenance. Leads and pitches created over MCP are stamped
source="agent"server-side. The caller cannot override this —sourceis not an accepted argument, so an agent can never label its work as human-authored. - Reversible only. No destructive operations are exposed over MCP — there are no delete tools. Everything an agent creates can be reviewed and removed from the dashboard.
- No live send. There is deliberately no send tool. An agent can draft and stage a lead all the way to "ready," but a human triggers the actual email send from the dashboard.
| Tool | Description |
|---|---|
create_outreach_campaign | Create a new campaign owned by you. Returns the campaign id. |
add_outreach_lead | Add a single lead (stamped source="agent"). Does not send anything. |
assign_leads_to_campaign | Assign one or more of your leads to one of your campaigns. |
update_outreach_lead_status | Advance a lead's pipeline status and, optionally, record a reply / pitch / notes. |
draft_outreach_email | Save a draft subject / body onto a lead for human review. Never sends. |
create_outreach_pitch | Create a reusable pitch template (stamped source="agent"). |
Marketing workspace
Twenty-one owner-scoped tools cover Brand, Audience, Marketing Campaign, Content Asset, revision, calendar, and review workflows. marketing:read reads private context; marketing:agent_write creates/updates/submits drafts; the separate marketing:approve scope approves or rejects an exact submitted revision.
- Immutable review. Submitting freezes the revision. Approval records the exact SHA-256 content hash; later edits become a new draft revision.
- Separation of duties. Draft authority cannot approve, and reviewer authority cannot author drafts unless the key is explicitly granted both scopes.
- Private and non-destructive. Every lookup is filtered to the API-key owner. No Marketing delete/archive tool is exposed over MCP.
- No publishing side effect. Calendar dates are planning metadata. There is no publish or send tool or scope.
| Tools | Description |
|---|---|
list_marketing_brands / get_marketing_brand / create_marketing_brand / update_marketing_brand | Brand voice, value proposition, and guidelines. |
list_marketing_audiences / get_marketing_audience / create_marketing_audience / update_marketing_audience | Reusable audience definitions, pain points, and channels. |
list_marketing_campaigns / get_marketing_campaign / create_marketing_campaign / update_marketing_campaign | Content campaigns distinct from Sales outreach campaigns. |
list_content_assets / get_content_asset / get_content_calendar | Private revision history, review hashes, and planned dates. |
create_content_asset / update_content_asset / create_content_asset_revision / submit_content_asset | Governed draft workflow under marketing:agent_write. |
approve_content_asset / reject_content_asset | Review under the separately granted marketing:approve scope. Neither action publishes. |
Ticket board
Ten tools expose the in-platform ticket board. The two read tools require the tickets:read scope; seven planning and mutation tools require tickets:write, which is a superset that also satisfies tickets:read. The tenth, ticket_validation_finalize, requires the separate opt-in tickets:validate scope and does not imply read or write access. A prompt-only ticket_plan preview additionally requires councils:run because it invokes the configured planner and may consume model budget; supplied-plan preview and commit are provider-free. Plan and batch preview return a normalized commit_payload, deterministic IDs, and an exact preview_token. Commit combines those values with the caller-held idempotency key; retrying the exact commit returns the same IDs without duplicates. Per-owner ingress, weighted-row, live-ticket, and durable idempotency-ledger quotas bound bulk use while preserving exact replay at the storage cap.
ticket_list returns owner/filter-bound cursor pages of at most 200 rows. Reuse next_cursor with unchanged filters. Stable creation-time/UUID ordering keeps a full-board walk exact while already-returned tickets are edited, reordered, or moved. This is not a database snapshot: concurrent creation/deletion or hierarchy changes that alter recursive-subtree membership can affect later pages. With recursive=true, an owned UUID parent_id returns every descendant as one flat, cycle-safe set and excludes the anchor; the default remains direct children. scope selects active (the default), archived, or all; archiving is a flag rather than a status, so an archived ticket keeps whatever status it had and ticket_get still resolves it by id or unambiguous prefix.
ticket_validation_finalize commits one terminal verdict for an exact scenario version and lowercase SHA-256 scenario hash. Owner and actor are derived from the API key; callers cannot supply either. Evidence payloads are bounded opaque JSON: locator-looking URLs and paths are never fetched, opened, or resolved. Public adapters admit at most 10,000 JSON nodes per payload and 100,000 evidence JSON nodes across a request. An exact visible-ASCII idempotency-key retry by the same credential actor returns the original committed run; a rotated key is a different actor, and changed actor or content returns a stable conflict. Receipts are compact and never echo payloads: they contain evidence sequence/kind/digest entries plus the evidence count and manifest hash. The REST request is capped at 5 MiB before parsing; REST source-IP and credential/session actors are rate-limited independently. Hosted MCP retains its own transport IP/key ceilings plus the validation-actor ceiling. Durable limits retain at most 10,000 runs, 100,000 evidence items, and 268,435,456 canonical evidence-JSON characters per owner, plus 1,000 runs per scenario; the character ceiling bounds UTF-8 storage to at most four times that count.
The equivalent REST route is POST /api/tickets/{ticket_id}/scenarios/{scenario_id}/validation-runs. It accepts a user JWT or an API key carrying tickets:validate; both owner and actor still come only from that verified credential/session. The server acknowledges success only after commit.
Create, update, and get share the full ticket field set, including parent, session/workflow metadata links, labels, acceptance criteria, effort points, order index, and external references. Explicit clear flags safely remove optional links and effort points. Jira/Linear synchronization, Accounting, plan, and batch references are protected system metadata and cannot be spoofed, changed, or removed through generic MCP ticket writes. Session/workflow ids are metadata only, not access grants. Creator, comment-author, and mutation-trail identities are stamped server-side as api_key:<UUID> from the key that actually made the request; callers cannot provide them.
| Tool | Description |
|---|---|
ticket_list | Page through your tickets by status, assignee, action type, priority, parent, session/workflow metadata, or free text; optionally traverse all descendants. Returns at most 200 rows and an opaque next cursor. Requires tickets:read. |
ticket_get | Full detail for one ticket: all metadata, external references, acceptance criteria, subticket progress, and activity trail. Requires tickets:read. |
ticket_create | Create a ticket with full metadata, optionally as a subticket via parent_id; acting-key provenance is server-derived. Requires tickets:write. |
ticket_update | Safely edit, reparent, clear optional metadata, or move an owned ticket. Status and metadata mutations are audit-trailed with actual-key provenance; system refs remain protected. Requires tickets:write. |
ticket_comment | Add a comment or progress update to a ticket's activity trail. Requires tickets:write. |
ticket_claim | Claim a ticket: sets the assignee and moves it to in-progress in one audit-logged step. Requires tickets:write. |
ticket_archive | Retire a ticket and its active subtree from the working set, or restore exactly that cohort, without changing status. Reversible by construction and destroys nothing; the ticket keeps its id, so citations still resolve. An archived ticket is inert: writes are refused until it is restored. Requires tickets:write. |
ticket_plan | Preview a normalized plan, then atomically commit that exact plan without rerunning the planner. Requires tickets:write; prompt-only preview also requires councils:run, while supplied-plan preview and commit are provider-free. |
ticket_batch_create | Provider-free preview/commit for one explicit ticket tree with stable refs and deterministic IDs. It creates in-platform work records only and never executes them or changes an external system. |
ticket_validation_finalize | Commit or exactly replay one evidence-backed terminal result for an exact scenario revision. Requires the separate opt-in tickets:validate scope; opaque evidence is never fetched and only digest receipts are returned. |
Consulting workspace
Seventeen tools expose only the API-key owner's consulting records. Reads require consulting:read; drafting and workflow updates require consulting:write (which also satisfies reads); approvals require consulting:approve, the exact fetched version and content_hash, and a credential different from the last editor. Use separate writer and reviewer keys even when both belong to the same account.
| Tools | Description |
|---|---|
list/create/update_consulting_client | Manage private client records. |
list/get/create/update_consulting_engagement | Manage engagements and inspect their proposals/SOWs, milestones, deliverables, and optional Sales/Accounting references. |
create/update/approve_consulting_document_revision | Draft revision-safe proposals/SOWs; approval locks one exact revision and records the approver. |
initialize/update_consulting_milestone | Idempotently initialize stable milestone IDs/external refs and advance the work using expected_version compare-and-swap protection. |
create/update/submit/reopen/approve_consulting_deliverable | Run an explicit internal review state machine. Approval records evidence but never publishes, shares, sends, or creates a client link. |
Meta Council Feedback
A platform-feedback channel for reporting bugs, performance failures, and capability gaps in Meta Council itself directly to the platform admins — not for anything about your own business data (deals, invoices, tickets, etc.), which stays in its own tools.
| Tool | Description |
|---|---|
submit_meta_council_feedback | Submit platform feedback (bug, performance, missing capability, UX/docs gap) about Meta Council itself. Requires feedback:write; open to any authenticated caller. Write-only — submissions cannot be read back. submit_feedback still works as an unlisted alias for callers integrated before 2026-08-07. |
list_meta_council_feedback | Admin only: list platform-feedback reports across all users for triage. Requires feedback:admin and is additionally gated server-side by the fail-closed ADMIN_EMAILS check. list_feedback still works as an unlisted alias. |
triage_meta_council_feedback | Admin only: set a platform-feedback report's status and admin notes. Requires feedback:admin and the same fail-closed ADMIN_EMAILS check. triage_feedback still works as an unlisted alias. |
The meta-council-mcp 0.12.0 stdio package provides 98 tools, three resources, and three prompts; pip install meta-council-mcp installs this release. Accounting synchronization, ticket plan/batch, ticket field-parity, and ticket-validation finalization — source-only in the previous stable PyPI 0.8.0 (93-tool) release — are included. See the MCP setup guide for release status, raw JSON-RPC examples, scopes, polling, and source-run configuration.
Error Handling
All errors return a consistent JSON format with an appropriate HTTP status code.
Error response format
HTTP status codes
| Code | Meaning | Common causes |
|---|---|---|
400 | Bad Request | Missing required field, invalid JSON, malformed request body. |
401 | Unauthorized | Missing or invalid Authorization header. JWT expired. API key revoked. |
403 | Forbidden | Valid auth but insufficient permissions. Free tier trying to access Pro features. |
404 | Not Found | Session ID, panel slug, or agent slug does not exist. |
429 | Too Many Requests | Rate limit exceeded. Check the Retry-After header (seconds) for when to retry. Some fixed per-IP throttles (file upload, signup, workflow triggers, the council-run IP throttle) return 429 with no retry header. |
500 | Internal Server Error | Unexpected server error. Retry after a brief delay. Contact support if persistent. |
Example: handling errors
Keyboard Shortcuts
Speed up your workflow with these keyboard shortcuts.
Self-Hosting & Desktop App BETA
Run Meta Council entirely on your own hardware. Nothing leaves your machine.
Option 1: Docker (Recommended)
One command starts the web app + local AI model:
# After receiving your self-hosted package:
cd meta-council
docker compose up
Open http://localhost:8080. Ollama downloads Qwen 2.5 7B (~4.5 GB) on first run.
| Requirement | Minimum | Recommended |
|---|---|---|
| RAM | 8 GB | 16 GB+ |
| Disk | 10 GB free | 20 GB+ |
| GPU | Not required | NVIDIA (2-10x faster) |
Option 2: Desktop App
Native application for Mac, Windows, and Linux. Double-click to launch — auto-detects local Ollama for free inference.
cd desktop
npm install
npm start
Build installers: npm run build:mac / build:win / build:linux
Option 3: Full Offline (Air-Gapped)
For environments with no internet access:
- Install Ollama on the target machine
- Pull a model:
ollama pull qwen2.5:7b - Deploy Meta Council via Docker or the desktop app
- No internet required after initial setup
GPU Models
| Model | VRAM | Speed | Quality |
|---|---|---|---|
| Qwen 2.5 7B (default) | 6 GB | ~30 tok/s | Good |
| Qwen 2.5 14B | 12 GB | ~15 tok/s | Better |
| Qwen 3 32B | 24 GB | ~8 tok/s | Best |
Contact [email protected] for self-hosted access and the complete setup guide.