Voting Mcp

io.github.HrishiKabra由 GitHub 账号 HrishiKabra 发布v0.1.3更新于 Oct 24, 2026

Social-choice voting rules (Borda, Copeland, Condorcet, STV, opinion pool) as MCP tools.

已验证STDIO仅桌面数据与分析AI 与机器学习

概览

AI 生成的概览

将 Borda、Copeland、Condorcet、STV、意见池等社会选择投票规则作为 MCP 工具提供,用于汇总排序或赞成票。

可以做什么
提供可调用的工具,接收候选人加选票的 profile,返回包含完整共同获胜者集合、经打破平局后的单一获胜者、排名、各候选人得分和说明的 Result。规则包括 borda、copeland、condorcet、approval、stv、opinion_pool、plurality、majority 以及按 rule 枚举分发的 aggregate_rule。打破平局是显式参数(默认字典序、none 或带种子的随机)。另有基准脚本汇总多个 LLM 的集成结果,并将各规则与简单多数票比较。
适用场景
适合助手或多智能体系统需要合并多个投票者或模型偏好、而不只是统计首选票的场景,例如汇总 LLM 集成结果或进行社会选择实验。基准脚本用于在推理数据集上衡量某规则是否优于多数票。
运行要求
以 PyPI 包 voting-mcp 通过 stdio 在本地运行,通常用 uvx 启动,或从源码用 uv 运行。未声明账号、API 密钥、环境变量或请求头。可选基准需要 bench 附加依赖,并通过 OpenRouter 使用兼容 OpenAI 的客户端,还需要网络访问以获取数据集和调用 API。
安装前请注意
该服务器自称纯计算,无网络、无文件写入、无密钥。基准会通过 OpenRouter 调用外部 API,先打印费用估算并在未确认时停止,原始响应缓存在 bench/results/raw。将仓库放在 iCloud 同步文件夹中可能导致可编辑安装失效。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Voting Mcp,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

voting-mcp

Principled social-choice aggregation as MCP tools — with a benchmark that measures the accuracy lift over naive majority vote.

Almost every multi-agent system aggregates votes with Counter(votes).most_common(1), throwing away preference order and confidence. voting-mcp ships the real rules (Borda, Copeland, Condorcet, approval, STV, linear opinion pool) as callable MCP tools — each with its known axiomatic behavior and explicit, documented tie-breaking — plus a reproducible benchmark that aggregates a diverse ensemble of LLMs on a reasoning set and reports accuracy with bootstrap confidence intervals.

The server is pure compute: stdio transport, no network, no file writes, no secrets — clean against the OWASP MCP Top 10 by construction.

Install

sh
# run the server directly (once published)uvx voting-mcp
# or from sourcegit clone https://github.com/HrishiKabra/voting-mcp && cd voting-mcpuv syncuv run python -m voting_mcp.server

Add it to an MCP client (e.g. Claude Desktop claude_desktop_config.json):

json
{  "mcpServers": {    "voting": { "command": "uvx", "args": ["voting-mcp"] }  }}

Tools

Every tool takes a profile ({candidates, ballots}) and returns a Result with the full co-winner set (winners, so ties are never hidden), the single tie-broken winner (or null when none exists), a ranking, per-candidate scores, and a note.

ToolBallotsNotes
bordarankingspositional; Condorcet-inconsistent, clone-sensitive
copelandrankingsCondorcet-consistent pairwise (+1 win, +0.5 tie)
condorcetrankingsreturns the pairwise winner or an explicit no-winner on a cycle
approvalapproval setsmost-approved wins
stvrankingssingle-winner instant-runoff; clone-resistant
opinion_pooldistributionslinear pool — preserves confidence, not an argmax vote
pluralityrankingsbaseline (most first choices)
majorityrankingsstrict >50% or no winner
aggregate_ruleanydispatch by a rule enum

Tie-breaking is an explicit parameter (lexicographic default, none, or seeded random).

Benchmark

Aggregate an ensemble of 5 models (one OpenAI-compatible client via OpenRouter) on ARC-Challenge and compare each rule to the naive majority vote:

sh
uv sync --extra benchuv run python -m bench.fetch_arc --limit 200# prints a cost estimate and STOPS; add --yes to actually call the API, --mock for a free dry runuv run python -m bench.run_ensemble --dataset bench/datasets/arc_challenge.jsonl --limit 200 --yesuv run python -m bench.compare --dataset bench/datasets/arc_challenge.jsonl --limit 200

Every raw response is cached under bench/results/raw/; re-runs never re-call the API, so aggregation tweaks are free.

Results

5-model ensemble (gpt-4o-mini · gemini-2.5-flash-lite · deepseek-v3 · claude-haiku-4.5 · glm-4.7), n = 200, bootstrap 95% CI. Two datasets of different difficulty; full write-up and both plots in RESULTS.md.

MMLU-Pro (hard, baseline 73.5%) — the informative case:

RuleAccuracy95% CIpaired Δ vs majorityp
opinion_pool0.755[0.695, 0.815]+0.020 [−0.011, +0.052]0.225
majority_vote (baseline)0.735[0.679, 0.788]——
approval0.701[0.640, 0.757]−0.035 [−0.063, −0.006]0.014
stv0.693[0.630, 0.750]−0.043 [−0.072, −0.015]0.002
copeland0.647[0.580, 0.710]−0.088 [−0.127, −0.052]<0.001
condorcet0.620[0.550, 0.685]−0.115 [−0.155, −0.079]<0.001
majority (strict)0.590[0.520, 0.655]−0.145 [−0.189, −0.105]<0.001
borda0.472[0.405, 0.540]−0.263 [−0.323, −0.206]<0.001

Δ is tested with a paired bootstrap on the per-question accuracy difference (same questions, so shared difficulty cancels), not by eyeballing the independent CIs.

[MMLU-Pro]

The finding (honest): the value isn't "fancy voting beats majority." It's that the confidence-preserving rule (opinion_pool) wins when the crowd is uncertain (+2.0pp, the only rule above baseline — suggestive but not significant at n=200, paired p=0.225), while forcing the distributions into full rankings actively hurts, significantly — every ranking rule is below baseline at paired p≤0.014, and borda collapses to 0.472 because with 10 options the tail of the ranking is mostly noise. Aggregate the confidence; don't throw it away. On ARC-Challenge (baseline 96.8%, near-ceiling) nothing separates — no rule differs significantly. See RESULTS.md.

Develop

sh
uv run pytest -quv run ruff check .uv run mypy --strict src# exercise the tools in the MCP Inspector:npx @modelcontextprotocol/inspector uv run python -m voting_mcp.server

Note: if you keep this repo under an iCloud-synced folder (e.g. ~/Desktop), iCloud can spawn duplicate .pth files that intermittently break the editable install. Tests use pythonpath=src; run the server with PYTHONPATH=src if an import fails, or move the repo off the synced folder.

Related research

The choice of rules here grows out of the author's work on voting-rule design: Optimizing Voting Rules for Social Welfare and Beyond (AAMAS). That line of work asks which aggregation rules maximize welfare given how voters actually express preferences; this project applies the same lens to LLM ensembles — where the benchmark's answer is that confidence-preserving aggregation (the linear opinion pool) is what pays off, and forcing cardinal beliefs into ordinal rankings destroys signal.

License

MIT

来源:README.md,提交 1c7fb21

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

1
  1. v0.1.3最新Sep 16, 2026

评分

已满足适用检查项的 40%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分

    请在仓库或注册中心条目中声明许可证。