{"id":48153222,"url":"https://github.com/kaicianflone/consensus-local-mcp-board","last_synced_at":"2026-04-04T17:13:56.894Z","repository":{"id":341695367,"uuid":"1171115460","full_name":"kaicianflone/consensus-local-mcp-board","owner":"kaicianflone","description":"Local-first MCP runtime for multi-agent consensus guard workflows. AI code review, weighted voting, HITL approval gates, full observability — all on SQLite.","archived":false,"fork":false,"pushed_at":"2026-03-10T00:37:59.000Z","size":30515,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-10T08:10:22.762Z","etag":null,"topics":["ai-agents","code-review","consensus","guard","human-in-the-loop","mcp","openai","sqlite","typescript","workflow-engine"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kaicianflone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-02T22:19:35.000Z","updated_at":"2026-03-10T00:37:58.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kaicianflone/consensus-local-mcp-board","commit_stats":null,"previous_names":["kaicianflone/consensus-local-mcp-board"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/kaicianflone/consensus-local-mcp-board","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaicianflone%2Fconsensus-local-mcp-board","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaicianflone%2Fconsensus-local-mcp-board/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaicianflone%2Fconsensus-local-mcp-board/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaicianflone%2Fconsensus-local-mcp-board/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kaicianflone","download_url":"https://codeload.github.com/kaicianflone/consensus-local-mcp-board/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kaicianflone%2Fconsensus-local-mcp-board/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31407644,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","code-review","consensus","guard","human-in-the-loop","mcp","openai","sqlite","typescript","workflow-engine"],"created_at":"2026-04-04T17:13:56.082Z","updated_at":"2026-04-04T17:13:56.799Z","avatar_url":"https://github.com/kaicianflone.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![TypeScript](https://img.shields.io/badge/TypeScript-Strict-3178C6?logo=typescript\u0026logoColor=white)](https://www.typescriptlang.org/)\n[![MCP](https://img.shields.io/badge/MCP-Local_Server-111111)](https://modelcontextprotocol.io/)\n[![SQLite](https://img.shields.io/badge/SQLite-Append--Only-003B57?logo=sqlite\u0026logoColor=white)](https://www.sqlite.org/)\n[![Vite](https://img.shields.io/badge/Vite-React_UI-646CFF?logo=vite\u0026logoColor=white)](https://vitejs.dev/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](./LICENSE)\n\n# consensus-local-mcp-board\n\nLocal-first MCP runtime for multi-agent consensus guard workflows — AI code review, weighted voting, HITL approval gates, and full observability on SQLite.\n\n---\n\n## Quick Start\n\n```bash\ngit clone https://github.com/kaicianflone/consensus-local-mcp-board.git\ncd consensus-local-mcp-board\nnpm install\nnpm run start\n```\n\n| Service | URL |\n|---|---|\n| API | `http://127.0.0.1:4010` |\n| UI | `http://127.0.0.1:5000` |\n\nMCP stdio mode (Claude Desktop, OpenClaw, etc.):\n\n```bash\nnpm run mcp:dev\n```\n\n**Prerequisites:** Node.js 20+, npm 10+. Optional: `gh` CLI (for GitHub PR triggers), OpenAI API key (falls back to deterministic heuristics without one).\n\n---\n\n## Supported Models\n\nAny model accessible via the OpenAI or Anthropic SDKs works. The UI dropdown includes:\n\n| Provider | Model | ID | Notes |\n|---|---|---|---|\n| OpenAI | GPT-5.4 | `gpt-5.4` | **Default.** Most capable for professional work |\n| OpenAI | GPT-5.4 Pro | `gpt-5.4-pro` | Smarter, more precise responses |\n| OpenAI | GPT-5.2 | `gpt-5.2` | Previous frontier model |\n| OpenAI | GPT-5.1 | `gpt-5.1` | Best for coding and agentic tasks |\n| OpenAI | GPT-5 | `gpt-5` | Reasoning model |\n| OpenAI | GPT-5 Mini | `gpt-5-mini` | Faster, cost-efficient |\n| OpenAI | GPT-5 Nano | `gpt-5-nano` | Fastest, most cost-efficient |\n| OpenAI | GPT-5.3 Codex | `gpt-5.3-codex` | Most capable agentic coding model |\n| Anthropic | Claude Opus 4.6 | `claude-opus-4-6` | Most intelligent for agents and coding |\n| Anthropic | Claude Sonnet 4.6 | `claude-sonnet-4-6` | Best speed/intelligence balance |\n| Anthropic | Claude Haiku 4.5 | `claude-haiku-4-5` | Fastest, near-frontier intelligence |\n\nConfigure per-agent in the workflow definition or via the UI. Set `AI_MODEL` env var or store via `POST /api/settings/credentials` to change the default.\n\n---\n\n## Template 1: GitHub PR Merge Guard\n\nThe flagship workflow. Fetches a GitHub PR, runs 3 parallel AI reviews, resolves consensus through weighted voting, gates on human approval when risk is high, and merges only when everything passes.\n\n```text\n┌─────────────────────┐\n│ 1. Trigger          │  Fetches PR diff, files, metadata via gh CLI\n│    GitHub PR Opened │\n└──────────┬──────────┘\n           │\n           ▼\n┌─────────────────────┐\n│ 2. Parallel Review  │  3 agents run concurrently:\n│    (Group Node)     │  • security-reviewer\n│                     │  • performance-analyst\n│                     │  • code-quality-reviewer\n│                     │  Each returns: vote, risk score, rationale\n└──────────┬──────────┘\n           │\n           ▼\n┌─────────────────────┐\n│ 3. Code Merge Guard │  Weighted voting resolution:\n│    (Guard Node)     │  • reputation-modulated weights\n│                     │  • combined risk scoring\n│                     │  • quorum threshold check\n└──────────┬──────────┘\n           │\n           ▼\n┌─────────────────────┐\n│ 4. HITL Gate        │  Slack / Teams / Discord DM\n│    (Human Approval) │  when risk \u003e threshold\n│                     │  Reply: YES / NO / REWRITE\n└──────────┬──────────┘\n           │\n           ▼\n┌─────────────────────┐\n│ 5. Action           │  Merge PR. Executes only if\n│    (Merge PR)       │  guard passed + human approved\n└─────────────────────┘\n```\n\n### Decision Model\n\nEvery guard evaluation produces one of four decisions:\n\n| Decision | When | Result |\n|---|---|---|\n| `ALLOW` | Risk acceptable, quorum met | Action proceeds |\n| `BLOCK` | Any NO votes with high risk, or risk \u003e `blockAboveRisk` | Rejected |\n| `REWRITE` | High risk, majority REWRITE votes, zero NOs | Paused with rewrite guidance |\n| `REQUIRE_HUMAN` | Weighted YES ratio below quorum | Paused, HITL approval prompt sent |\n\nThe logic:\n\n1. **Risk \u003e threshold?**\n   - Any NO → `BLOCK`\n   - Majority REWRITE (no NOs) → `REWRITE`\n   - Otherwise → `BLOCK`\n2. **REWRITE + risk \u003e `blockAboveRisk`?** → escalated to `BLOCK`\n3. **YES ratio \u003c quorum?** → `REQUIRE_HUMAN`\n4. **Otherwise** → `ALLOW`\n\n`blockAboveRisk` is configurable per guard node (default `1.0` / disabled). Template 1 sets `0.92`.\n\n### Weighting Modes\n\n| Mode | Formula | Use case |\n|---|---|---|\n| `static` | raw weight | Equal voices |\n| `reputation` | reputation / 100 | Ledger-driven trust |\n| `hybrid` | weight × (reputation / 100) | **Default.** Manual weight modulated by earned reputation |\n\n---\n\n## Architecture\n\n```text\nweb (Vite/React)\n   │ polls API (1-2s)\n   ▼\nserver/api (Express + zod)\n   │\n   ├──▶ workflows/runner.ts       Durable workflow engine\n   │      ├──▶ adapters/ai-sdk.ts       OpenAI agent evaluation\n   │      ├──▶ adapters/chat-sdk.ts     Slack/Teams/Discord/Telegram HITL\n   │      └──▶ adapters/consensus-tools  Board resolution + ledger\n   │\n   ├──▶ tools/registry.ts         MCP tool registry\n   ├──▶ db/store.ts               SQLite (boards, runs, events, participants)\n   │      └──▶ db/credentials.ts  AES-256-GCM encrypted credentials\n   └──▶ engine/hitl-tracker.ts    Approval timeout management\n```\n\n```text\nconsensus-local-mcp-board/\n  shared/src/index.ts         Zod schemas, voting logic, decision model\n  server/src/\n    index.ts                  API routes, Template 1 definition\n    workflows/runner.ts       Workflow execution engine\n    adapters/                 ai-sdk, chat-sdk, consensus-tools\n    db/                       SQLite store, encrypted credentials\n    tools/registry.ts         MCP tool registry\n    mcp/server.ts             MCP stdio server\n  web/src/\n    pages/                    WorkflowsDashboard\n    components/workflow/      NodeCanvas, NodeSettings, EventTimeline\n    components/agents/        AgentsPanel\n```\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eIntegrating External Agents\u003c/strong\u003e\u003c/summary\u003e\n\n### Register an agent\n\n```bash\ncurl -X POST http://127.0.0.1:4010/api/agents/connect \\\n  -H 'content-type: application/json' \\\n  -d '{\n    \"name\": \"ci-bot\",\n    \"scopes\": [\"workflow.run\", \"tool.*\"],\n    \"boards\": [\"workflow-system\"]\n  }'\n```\n\nResponse includes an `apiKey`. Store it securely.\n\n### Register agent participants\n\n```bash\ncurl -X POST http://127.0.0.1:4010/api/participants \\\n  -H 'content-type: application/json' \\\n  -d '{\n    \"boardId\": \"workflow-system\",\n    \"subjectType\": \"agent\",\n    \"subjectId\": \"security-reviewer\",\n    \"role\": \"reviewer\",\n    \"weight\": 1,\n    \"reputation\": 100,\n    \"metadata\": {\n      \"model\": \"gpt-5.4\",\n      \"systemPrompt\": \"You are a security-focused code reviewer.\"\n    }\n  }'\n```\n\n### Trigger via agent API\n\n```bash\ncurl -X POST http://127.0.0.1:4010/api/agent/trigger \\\n  -H 'x-agent-key: \u003cyour-api-key\u003e' \\\n  -H 'content-type: application/json' \\\n  -d '{ \"workflowId\": \"\u003cworkflow-id\u003e\" }'\n```\n\nReputation updates automatically after each resolution: aligned verdicts earn payouts, opposed verdicts get slashed. The `hybrid` weighting mode makes earned reputation meaningful.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eIntegrating Humans (HITL)\u003c/strong\u003e\u003c/summary\u003e\n\n### Store bot tokens\n\n```bash\n# Slack\ncurl -X POST http://127.0.0.1:4010/api/settings/credentials \\\n  -H 'content-type: application/json' \\\n  -d '{ \"provider\": \"slack\", \"keyName\": \"bot_token\", \"value\": \"xoxb-...\" }'\n\n# Discord\ncurl -X POST http://127.0.0.1:4010/api/settings/credentials \\\n  -H 'content-type: application/json' \\\n  -d '{ \"provider\": \"discord\", \"keyName\": \"bot_token\", \"value\": \"...\" }'\n\n# Telegram\ncurl -X POST http://127.0.0.1:4010/api/settings/credentials \\\n  -H 'content-type: application/json' \\\n  -d '{ \"provider\": \"telegram\", \"keyName\": \"bot_token\", \"value\": \"...\" }'\n\n# Teams\ncurl -X POST http://127.0.0.1:4010/api/settings/credentials \\\n  -H 'content-type: application/json' \\\n  -d '{ \"provider\": \"teams\", \"keyName\": \"webhook_url\", \"value\": \"https://...\" }'\n```\n\n### Register human participants with chat metadata\n\n```bash\ncurl -X POST http://127.0.0.1:4010/api/participants \\\n  -H 'content-type: application/json' \\\n  -d '{\n    \"boardId\": \"workflow-system\",\n    \"subjectType\": \"human\",\n    \"subjectId\": \"kai\",\n    \"role\": \"approver\",\n    \"weight\": 1,\n    \"metadata\": { \"chatAdapter\": \"slack\", \"chatHandle\": \"U0123456789\" }\n  }'\n```\n\n### Approval flow\n\n1. Guard resolves → risk \u003e threshold → workflow pauses\n2. DM sent to registered humans via their chat adapter\n3. Human replies: YES / NO / REWRITE\n4. Workflow resumes accordingly\n\n### Manual approval (no chat adapter)\n\n```bash\ncurl -X POST http://127.0.0.1:4010/api/workflow-runs/\u003crunId\u003e/approve \\\n  -H 'content-type: application/json' \\\n  -d '{ \"decision\": \"YES\", \"approver\": \"kai\" }'\n```\n\n### Prompt modes\n\n| Mode | Behavior |\n|---|---|\n| `yes-no` | YES or NO (default) |\n| `approve-reject-revise` | APPROVE, REJECT, or REVISE |\n| `vote` | Multiple votes required (configurable) |\n| `acknowledge` | ACK to acknowledge |\n\nHITL nodes support `timeoutSec` (default 900). On expiry, auto-resolves with `autoDecisionOnExpiry` (default: `BLOCK`).\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eUI Dashboard\u003c/strong\u003e\u003c/summary\u003e\n\nThe web UI at `http://127.0.0.1:5000` provides real-time observability.\n\n**What it shows:**\n- **Workflow builder** — drag-and-drop nodes (trigger, agent, guard, HITL, group, action), visual canvas, per-node config\n- **Node settings** — model selection, persona assignment, guard thresholds, HITL channel/timeout\n- **Workflow runs** — status badges, one-click approve/block for pending runs\n- **Event timeline** — chronological append-only stream (WORKFLOW_STARTED, AGENT_VERDICT, RISK_SCORE, CONSENSUS_QUORUM, etc.)\n- **Agents panel** — participants, reputation scores, weight assignments\n- **Board inspector** — board listing, run history, event drill-down\n\n### Forking / embedding\n\nThe UI is a standalone Vite/React app in `web/`. It polls the API via `web/src/lib/api.ts`. To embed: copy `web/`, point the API base URL at your server.\n\nKey files: `WorkflowsDashboard.tsx`, `NodeCanvas.tsx`, `NodeSettings.tsx`, `EventTimeline.tsx`, `AgentsPanel.tsx`.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAPI Reference\u003c/strong\u003e\u003c/summary\u003e\n\n### Workflows\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `GET` | `/api/workflows` | List workflows (auto-creates Template 1 if empty) |\n| `POST` | `/api/workflows` | Create workflow `{ name, definition }` |\n| `GET` | `/api/workflows/:id` | Get workflow + run history |\n| `PUT` | `/api/workflows/:id` | Update workflow |\n| `POST` | `/api/workflows/:id/run` | Execute workflow |\n| `POST` | `/api/workflow-runs/:runId/approve` | Resume paused workflow `{ decision, approver }` |\n\n### Guards\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `POST` | `/api/mcp/evaluate` | Generic guard evaluation `{ boardId, action }` |\n| `POST` | `/api/guard.evaluate` | Typed guard evaluation `{ runId, boardId, guardType, payload, policy }` |\n| `POST` | `/api/human.approve` | Human approval `{ runId, replyText, approver }` |\n\n### Participants\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `GET` | `/api/participants?boardId=...` | List participants |\n| `POST` | `/api/participants` | Create participant |\n| `PATCH` | `/api/participants/:id` | Update participant |\n| `DELETE` | `/api/participants/:id` | Delete participant |\n\n### Agents\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `POST` | `/api/agents/connect` | Register agent → returns `apiKey` |\n| `GET` | `/api/agents` | List agents |\n| `POST` | `/api/agent/trigger` | Agent-triggered execution (requires `x-agent-key`) |\n\n### Votes + Policies\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `POST` | `/api/votes` | Submit vote |\n| `GET` | `/api/votes/:runId` | Get votes + aggregate |\n| `POST` | `/api/policies/assign` | Assign policy to board |\n| `GET` | `/api/policies/:boardId/:policyId` | Get policy assignment |\n\n### Credentials\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `GET` | `/api/settings/credentials` | List credentials (no values) |\n| `POST` | `/api/settings/credentials` | Store credential `{ provider, keyName, value }` |\n| `DELETE` | `/api/settings/credentials/:provider/:keyName` | Delete credential |\n| `GET` | `/api/settings/credentials/:provider/status` | Check provider status |\n\n### Boards + Events\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `GET` | `/api/mcp/boards` | List boards |\n| `GET` | `/api/mcp/events` | List events `?boardId=\u0026runId=\u0026type=\u0026limit=` |\n| `DELETE` | `/api/mcp/events` | Delete events `?boardId=\u0026runId=` |\n| `GET` | `/api/mcp/runs/:id` | Get run + events |\n| `GET` | `/api/mcp/audit/search` | Search events `?query=` |\n\n### Webhooks (Inbound)\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `POST` | `/api/webhooks/github` | GitHub webhook (triggers matching workflows) |\n| `POST` | `/api/webhooks/slack/events` | Slack Events API |\n| `POST` | `/api/webhooks/teams/activity` | Teams Bot Framework |\n| `POST` | `/api/webhooks/discord/interactions` | Discord interactions |\n| `POST` | `/api/webhooks/telegram` | Telegram updates |\n| `POST` | `/api/webhooks/chat/:adapter` | Generic chat adapter |\n\n### MCP Tools\n\n| Method | Endpoint | Description |\n|---|---|---|\n| `GET` | `/api/mcp/tools` | List tool names |\n| `POST` | `/api/mcp/tool/:name` | Invoke tool |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eConfiguration\u003c/strong\u003e\u003c/summary\u003e\n\n### Environment variables\n\n| Variable | Description | Default |\n|---|---|---|\n| `OPENAI_API_KEY` | OpenAI API key | (deterministic fallback) |\n| `AI_MODEL` | Default agent model | `gpt-5.4` |\n| `CHAT_PROVIDER` | Chat dispatch: `webhook` or `stdout` | `webhook` |\n| `SLACK_BOT_TOKEN` | Slack bot token | — |\n| `DISCORD_BOT_TOKEN` | Discord bot token | — |\n| `TELEGRAM_BOT_TOKEN` | Telegram bot token | — |\n| `TEAMS_WEBHOOK_URL` | Teams webhook URL | — |\n| `GCHAT_WEBHOOK_URL` | Google Chat webhook URL | — |\n| `CREDENTIALS_SECRET` | Master encryption key | (auto-generated) |\n| `VERBOSE` | Verbose logging (`1`) | — |\n\nAll secrets can also be stored via `POST /api/settings/credentials` (encrypted at rest, takes precedence over env vars).\n\n### .consensus/config.json\n\n```json\n{\n  \"board_mode\": \"local\",\n  \"api_url\": \"http://127.0.0.1:4010\"\n}\n```\n\n\u003c/details\u003e\n\n---\n\n## Tool Matrix\n\n| Tool | Status | Description |\n|---|---|---|\n| `guard.evaluate` | ✅ | Generic guard entrypoint |\n| `guard.code_merge` | ✅ | Sensitive files, protected branches, CI checks |\n| `guard.send_email` | ✅ | Allowlist/blocklist, attachment policy, secrets scanning |\n| `guard.publish` | ✅ | Profanity filter, PII detection, blocked words |\n| `guard.support_reply` | ✅ | Escalation keywords, auto-escalate |\n| `guard.agent_action` | ✅ | Tool allowlist/blocklist, irreversibility check |\n| `guard.deployment` | ✅ | Environment-aware approval gates |\n| `guard.permission_escalation` | ✅ | Break-glass, MFA support |\n| `guard.policy.describe` | ✅ | Describe policy schema for any guard type |\n| `persona.generate` | ✅ | Generate persona set for a board |\n| `board.list` / `board.get` | ✅ | Ledger-backed board queries |\n| `run.get` | ✅ | Ledger-backed run queries |\n| `audit.search` | ✅ | Search events by payload/type |\n| `human.approve` | ✅ | Submit human approval decision |\n\n---\n\n## Safety\n\n- **Append-only events** — no mutation after write. Full audit trail.\n- **Secret redaction** — sensitive fields (`apiKey`, `token`, `password`, `secret`, `authorization`, `cookie`) redacted before persistence.\n- **Encrypted credentials** — AES-256-GCM. Key derived from `CREDENTIALS_SECRET` via scrypt or auto-generated on first run.\n- **Localhost-only** — binds to `127.0.0.1:4010`. No external exposure unless explicitly proxied.\n- **Typed contracts** — all API I/O validated with zod. Invalid payloads return structured errors.\n- **Idempotency keys** — guard evaluations, votes, and approvals prevent duplicate processing.\n- **GitHub webhook verification** — HMAC-SHA256 signature verification via `crypto.timingSafeEqual`.\n\n---\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaicianflone%2Fconsensus-local-mcp-board","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkaicianflone%2Fconsensus-local-mcp-board","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkaicianflone%2Fconsensus-local-mcp-board/lists"}