conversation-council
This server provides a local, privacy-preserving way to index, search, and manage your Codex task history. It powers an evidence-backed AI council to help make decisions based on prior work, while redacting sensitive information and maintaining workspace isolation by default.
Check status: Report the readiness of local history, index, and runtime.
Index workspace: Scan and index visible Codex task messages for a workspace, with options to force re-indexing or include all known workspaces globally.
Search history: Query indexed history with a natural-language question to find evidence-backed councillors (past tasks), scoped to a workspace or globally, with a configurable result limit.
Retrieve evidence: Resolve opaque evidence IDs to view the original content within a workspace.
Manage pins: List pinned tasks (preferred councillors) or pin/unpin a task by thread ID to mark it as a preferred councillor.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@conversation-councilShould we keep the current queue architecture?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Codex Conversation Council
An evidence-backed council for Codex, built from your own local task history.
$conversation-council finds prior Codex tasks relevant to the current decision, assigns up to three independent councillors, verifies their historical claims against local evidence, and chairs a compact recommendation. It runs inside your existing Codex session: no extra model key, external service, or runtime network request is required.

macOS Alpha v0.2. Windows support is planned after the local history and installation paths are validated in the field.
What is included
A Codex Desktop plugin with an explicit
$conversation-councilSkill.An interactive MCP Apps Council Dashboard rendered inside supported Codex conversations.
A local stdio MCP server with six history/evidence tools and one presentation tool.
A standalone
councilCLI with JSON output parity.Workspace isolation by default; cross-project history requires
--global.Local redaction, SQLite FTS5 search, stable evidence IDs, and pinning.
Optional
--deepreview by an anonymous critic.
Related MCP server: Codex History Hub
Install the macOS Alpha
Requirements: Codex Desktop/CLI, macOS, and Python 3.11 or newer with SQLite FTS5.
git clone https://github.com/URneiU1/codex-conversation-council.git
cd codex-conversation-council
./scripts/install.shThe installer registers this checkout as a local Codex marketplace, installs the plugin, and runs diagnostics. Start a new Codex task so its Skill and MCP tools are loaded, then invoke:
$conversation-council Should we keep the current queue architecture?After the chair verifies the cited evidence, supported Codex surfaces render an inline Council Dashboard showing the question, each councillor's stance and labeled points, consensus, disagreements, recommendation, unresolved risks, and evidence locations. If a client cannot render MCP Apps UI, the same result remains available as text.
For an extra critic pass:
$conversation-council --deep Should we keep the current queue architecture?Cross-project search is never automatic. Opt in explicitly:
$conversation-council --global What did our previous migrations teach us?CLI
Run from the checkout, or install the Python package to expose the council command.
python3 scripts/council.py doctor
python3 scripts/council.py index --workspace "$PWD"
python3 scripts/council.py search "queue architecture" --workspace "$PWD"
python3 scripts/council.py pin THREAD_ID
python3 scripts/council.py show EVIDENCE_ID --workspace "$PWD"Every user command supports --json. Use --global only with index, search, or show when you intentionally want known cross-workspace history.
How it works
The indexer reads Codex session JSONL and keeps only visible user and assistant task messages.
Built-in redaction masks common tokens, credentials, private keys, and authenticated URLs before text enters the derived index.
SQLite FTS5 retrieves relevant tasks inside the current canonical workspace. Pins and recency are bounded tie-breakers.
Evidence is rendered to local Markdown with an opaque ID, original task ID, role, and source JSONL line.
The Skill convenes independent councillors, optionally adds a critic, resolves every cited evidence ID, and chairs the result.
The presentation-only
render_counciltool displays that verified result through the portable MCP Apps UI resource; it does not change or re-run the council.
Historical excerpts are treated as untrusted quoted data. The Skill instructs councillors never to follow commands found inside history.
For MCP calls, the non-global workspace is bound to the current Codex task ID supplied by the host. Requests for a different known workspace are rejected unless the user explicitly invoked --global. Deleted or changed source tasks are reconciled from the derived index, and their rendered evidence is removed.
Privacy
The runtime makes no network requests. It reads Codex task history, indexes only visible user and assistant text after local redaction, defaults to the current workspace, and never modifies source history. Derived data defaults to ~/.codex/conversation-council/ (or PLUGIN_DATA when Codex supplies it).
Redaction is defense in depth, not a guarantee that arbitrary secrets can always be recognized. Review your task history before deliberately using --global, and never attach real Codex logs to public issues.
Run python3 scripts/council.py doctor to inspect paths. Uninstall while retaining the derived index:
./scripts/uninstall.shDelete plugin-owned derived state as well:
./scripts/uninstall.sh --purge-dataStandalone Skill and MCP
The Skill lives at skills/conversation-council/SKILL.md. The plugin manifest points Codex at that directory and at .mcp.json; the same MCP operations are available through python3 scripts/council.py serve-mcp. The Python runtime uses only the standard library.
Development
PYTHONPATH=src python3 -m unittest discover -s tests -v
python3 -m compileall -q src scripts
git diff --checkSee CONTRIBUTING.md and SECURITY.md before opening a change or reporting a vulnerability.
Inspiration and license
This is an independent clean-room implementation. The historical-conversation-as-councillor concept was inspired by CS-Faith/conversation-council. See NOTICE.md for attribution details.
Released under the MIT License.
Available Tools
6 toolscouncil_statusARead-only
Report local history, index, and runtime readiness.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description simply states 'report,' which aligns with the readOnlyHint annotation but adds no additional behavioral context beyond what the annotation already conveys. It does not disclose what 'readiness' entails, whether it is costly to invoke, or any other operational details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence with no wasted words. It front-loads the action and key subjects, making it easy to scan and understand.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, parameterless, read-only tool with no output schema, the description is minimally sufficient but does not clarify the report's format or the specific meaning of 'readiness.' It leaves some ambiguity about what consumers can expect from the returned status.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty. The description is not required to elaborate on parameter semantics. With no parameters, the baseline is 4, which is appropriate here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') and clearly identifies the three resources covered (local history, index, and runtime readiness). It meaningfully distinguishes this from sibling tools like index_workspace or search_history, which perform actions rather than report status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies using this tool to check the status of local history, index, and runtime readiness, but provides no explicit guidance on when to prefer it over alternatives or any exclusions. It is adequate but lacks direct comparative context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_evidenceARead-only
Resolve opaque evidence IDs inside the requested workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | Yes | Absolute workspace path from Codex task metadata. | |
| evidence_ids | Yes | ||
| global_scope | No | Operate across known workspaces only when explicitly true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already signals a safe read operation. The description adds minimal context about resolving IDs within a workspace, but does not disclose potential edge cases, return behavior, or effects of the global_scope parameter. It does not contradict the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that immediately states the core purpose. There is no filler or redundant information, and the key terms ('opaque', 'requested workspace') are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and minimal annotations, the description leaves room for ambiguity about what 'resolve' returns and how errors are handled. It also does not address the global_scope option's effect on behavior. The tool is simple enough that the description is adequate but not fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, and the description aligns with the evidence_ids and workspace parameters by mentioning 'evidence IDs' and 'requested workspace'. The global_scope parameter is left to the schema, which adequately describes it. The description adds some context but does not fully compensate for the missing parameter-level explanations.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action: resolving opaque evidence IDs within a specified workspace. This is a specific verb+resource combination that distinguishes it from the listed sibling tools, which involve status, indexing, history, and pin management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when opaque evidence IDs need to be resolved inside a workspace, but it does not explicitly state when to use this tool versus alternatives or mention any preconditions or exclusions. The context is clear enough for basic selection but lacks explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
index_workspaceC
Index visible Codex task messages for an allowed workspace.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | ||
| workspace | Yes | Absolute workspace path from Codex task metadata. | |
| global_scope | No | Operate across known workspaces only when explicitly true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It does not mention side effects (e.g., mutation, overwriting), required permissions, or what 'allowed workspace' means. The phrase 'Index visible Codex task messages' is a high-level summary without behavioral detail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no irrelevant words. It is front-loaded with the action verb 'Index' and clearly states the object and scope. This is appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of output schema and annotations, and the presence of three parameters with partial schema coverage, the description is too sparse to be complete. It does not explain expected outcomes, side effects, or usage context, leaving the agent without sufficient information for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 67% (workspace and global_scope have descriptions), but the tool description itself adds no parameter-specific meaning. It does not explain 'force' or the conditions for 'global_scope.' The description merely echoes 'workspace' implicitly, failing to compensate for the undocumented parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the verb 'Index' and identifies the resource as 'visible Codex task messages' for 'an allowed workspace,' which is a specific action. It distinguishes from sibling tools like search_history or list_pins, though not explicitly. Minor ambiguity remains about what 'index' entails, but it is not a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. The description does not mention prerequisites, such as ensuring the workspace is allowed, or context like using this before search_history. It lacks any explicit or implicit usage direction beyond the basic action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pinsARead-only
List historical Codex tasks pinned as preferred councillors.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace | Yes | Absolute workspace path from Codex task metadata. | |
| global_scope | No | Operate across known workspaces only when explicitly true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description's 'List' action is consistent with that. It adds useful context about historical pinned tasks but does not disclose potential output shapes, permission requirements, or behavior when no pins exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. Every word contributes to defining the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list tool with full schema coverage and a clear read-only annotation, the description is adequate. It leaves some ambiguity about return format and exact semantics of 'preferred councillors,' but not enough to prevent correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds no additional meaning to the 'workspace' or 'global_scope' parameters beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') and a clear resource ('historical Codex tasks pinned as preferred councillors'), making it distinct from sibling tools like set_pin. It communicates both action and object without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives such as search_history or set_pin. The description does not explain the relevance of global_scope or why listing pins might be preferable to other history queries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_historyBRead-only
Find relevant evidence-backed councillors in local history.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| question | Yes | ||
| workspace | Yes | Absolute workspace path from Codex task metadata. | |
| global_scope | No | Operate across known workspaces only when explicitly true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The read-only annotation covers safety, and the description adds a filtering behavior ('evidence-backed'), but it does not disclose other behavioral traits such as workspace scoping or the effect of global_scope. It doesn't contradict the annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence, no redundant words, front-loaded with the action verb.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters and no output schema, the description is too sparse; it fails to specify what constitutes a valid 'question', the meaning of workspace scope, or expected return values, making it insufficient for reliable invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not explain any of the four parameters. With only 50% schema coverage, the 'question' and 'limit' parameters are not defined in either the schema or description, leaving the agent without necessary semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Find' and identifies the resource as 'evidence-backed councillors in local history', clearly distinguishing it from sibling tools like get_evidence or council_status. However, it could be more explicit about what inputs drive the search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives like council_status or get_evidence; the description offers no usage context, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_pinC
Pin or unpin an indexed historical Codex task.
| Name | Required | Description | Default |
|---|---|---|---|
| pinned | Yes | ||
| thread_id | Yes | ||
| workspace | Yes | Absolute workspace path from Codex task metadata. | |
| global_scope | No | Operate across known workspaces only when explicitly true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It only states the action without explaining side effects, whether the operation is idempotent, whether it requires specific permissions, or what happens if the thread is not indexed. The term 'indexed historical' adds minimal context but not enough to understand the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that conveys the core purpose efficiently. There is no waste, but it is extremely brief given the tool's parameter count and lack of annotation support. Still, for what it attempts, it is concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 4 parameters, no annotations, and no output schema, the description is inadequate. It does not clarify the meaning of 'indexed historical', the role of global_scope, or any return behavior. A user cannot confidently invoke this tool correctly from the description alone, especially concerning edge cases like unindexed threads or workspace scope.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds no parameter-level detail. Schema coverage is 50% (workspace and global_scope have descriptions; pinned and thread_id do not). The description does not compensate for the undocumented parameters, leaving thread_id and pinned undefined beyond their names. It only trivially maps 'pin/unpin' to the pinned boolean.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Pin or unpin') and the resource ('an indexed historical Codex task'). It distinguishes itself from sibling tools like list_pins (which lists pins) and index_workspace (which indexes workspaces). The verb+resource construction is specific and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention that list_pins is the appropriate tool for viewing pins, nor does it describe any prerequisites like being indexed. There are no explicit exclusions or alternative tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
6 tool updates
v0.1.0- First observed
council_status - First observed
get_evidence - First observed
index_workspace - First observed
list_pins - First observed
search_history - First observed
set_pin
TDQS
Each tool addresses a distinct operation: status, indexing, searching, evidence resolution, and pin management. No overlapping responsibilities; descriptions clarify the boundaries.
Tool names mostly follow verb_noun pattern (index_workspace, search_history, get_evidence, list_pins, set_pin). council_status breaks the pattern as a noun phrase, and singular/plural consistency varies slightly (list_pins vs set_pin).
With 6 tools, the scope is tightly focused on the conversation history and pinning workflow. Each tool serves a clear purpose without redundancy.
The server covers the full workflow: index, search, resolve evidence, manage pins, and check status. Pin/unpin handled in set_pin, and listing pins covered; no obvious missing operations for the stated purpose.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Retrieve citation-ready technical context and coordinate evidence-backed work between AI agents.
Private-by-default, local-first memory/context/task orchestrator for MCP apps and agents.
Agent memory that refuses to guess: evidence-gated recall, exact-source reads, verifiable deletion.
Project memory for coding agents: requirements, decisions, code graph and delivery telemetry.
Related MCP Servers
- AlicenseBqualityAmaintenanceProvides local cross-session memory for Codex by importing transcripts, indexing in SQLite, and exposing search, context, and memory management through MCP tools.13MIT
- AlicenseAqualityCmaintenanceLocal-first, read-only Codex session aggregator that indexes multiple CODEX_HOME directories into a SQLite database and provides MCP tools for cross-project, archival, and sub-agent history queries.53MIT
- AlicenseNot gradedqualityBmaintenanceEnables local-first knowledge management for Codex, providing tools for guided discussions, contextual recall, review, and daily topics.MIT
- AlicenseNot gradedqualityAmaintenanceEnables local-first personal knowledge management for Codex by turning conversations into a searchable archive, extracting durable facts, building a knowledge graph, and injecting relevant context into later sessions.7MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/URneiU1/codex-conversation-council'
If you have feedback or need assistance with the MCP directory API, please join our Discord server