overton

overton

MCP server for Overton, an admission control daemon that gates coding agent dispatch based on per-account and per-project budget allocation. It lets agents ask for permission to run, returning verdicts such as go, wait, ask, or deny with retry timing to prevent overspending.

Category
访问服务器

README

Overton

Admission control for the coding agents you already pay for.

The Overton window: the range of dispatches currently acceptable.

You have four subscriptions and seven projects. Every orchestrator on your machine — Symphony, Paperclip, gastown, a cron script — will happily spawn an agent the moment it has work, because none of them know what the others are spending. Plan limits are per account. Ambition is per project. Nothing reconciles the two, so every project independently concludes it is on pace while together they are well over.

Overton is a small daemon that does exactly one thing: decide who may run, on whose budget, right now.

$ overton ask sideproject claude-personal
wait 4h12m · sideproject is over its weekly allocation on claude-personal
  account   claude-personal  7d 43% used (target 85, your reserve 15)
  project   sideproject  alloc 17.5 pts  used 21.3 pts
  clock     32% of the window elapsed → allowance 6.4 pts
  reading   ok, 41s old
  over by 14.9 pts. At this rate it finishes the window at 66.5 pts (380% of alloc).

  → try --account claude-work (2.1 of 40.0 pts used)
  → run it anyway with --force — logged, and counted against the next window
  → wait 4d19h — the clock catches up

It does not run agents. No worktrees, no tickets, no PRs, no merge queue. Sixty tools do that and they get better every month. Overton sits in front of them.


Four verbs

Meter Every account's real 5h / 7d utilization, from the vendor's own authority — not an estimate.
Attribute A ledger of what each project actually spent from each account window.
Allocate Weighted fair share of a rolling window. Reroute capacity between projects by changing one number.
Gate A typed decision — go / wait / ask / deny — with a reason, a remedy, and a retry-after.

Why a verdict and not a boolean

"No" has three meanings, and an orchestrator that cannot tell them apart either hammers a gate that will refuse it for four days, or gives up on a window that reopens in ten minutes.

verdict meaning what the caller should do exit code
go budget and capacity available dispatch 0
wait time fixes this sleep retryAfterSec, ask again 10
ask a human fixes this escalate; do not retry on a timer 11
deny policy fixes this never retry; this pairing is not allowed 12
overton ask myproject claude-personal || case $? in
  10) sleep "$(overton ask myproject claude-personal --json | jq .retryAfterSec)" ;;
  12) echo "not allowed on this account, ever"; exit 1 ;;
esac

Install

Needs Bun ≥ 1.3.

git clone https://github.com/hookdump/overton && cd overton
bun install
bun link                    # puts `overton` on your PATH

overton init                # writes ~/.overton/config.yaml
$EDITOR ~/.overton/config.yaml
overton doctor              # verify credentials before you rely on it
overton meter               # poll every account once
overton status
$ overton status
ACCOUNT          PROVIDER   PLAN  7d                5h   READING    CLAIMS
---------------  ---------  ----  ----------------  ---  ---------  ------
claude-personal  anthropic  max   [####------] 43%  14%  3s ago     0/6
claude-work      anthropic  team  [----------] 0%   0%   2s ago     0/6
codex-personal   codex      plus  [----------] 4%   —    20h3m ago  0/6
ollama           unmetered  —     unmetered         —    1s ago     0/2

PROJECT   ACCOUNT          SHARE  USED/ALLOWED  PACE        VERDICT
--------  ---------------  -----  ------------  ----------  -------
loopdeck  claude-personal  75%    0.0/19.2      under 19.2  go
loopdeck  codex-personal   100%   0.0/22.2      under 22.2  go
overton   claude-personal  25%    0.0/6.4       under 6.4   go

Using it

The simplest integration is the wrapper — ask, hold capacity, run, release:

overton run myproject claude-personal -- claude -p "fix issue 42"

Or wire it into whatever you already use. Three surfaces, same answers:

overton ask myproject claude-personal            # CLI, exit code carries the verdict
curl 'localhost:7787/v1/ask?project=P&account=A' # HTTP, always 200, decision in the body
overton mcp                                      # MCP over stdio, so an agent can ask

See docs/04-integration.md for recipes covering Symphony, Paperclip, GitHub Actions and a bare shell loop.

Configuration

accounts:
  claude-personal:
    provider: anthropic
    config_dir: ~/.claude-profiles/personal
    weekly_target_pct: 85          # account-wide stop, all projects
    interactive_reserve_pct: 15    # held back for YOUR terminal work
    max_concurrent: 6

projects:
  bigapp:
    roots: [~/Projects/bigapp]
    accounts:
      claude-personal: { weekly_share: 3 }

  sideproject:
    roots: [~/Projects/sideproject]
    accounts:
      claude-personal: { weekly_share: 1 }
      # claude-work is simply not named, so it may never be used

Two things about that file do most of the work.

A share is of the dispatchable pool, not of the plan. 85 − 15 = 70 points are available to agents; bigapp gets ¾ of them and sideproject ¼. Your own interactive work is never what gets squeezed.

Shares are weights, normalised across every project naming the account. You reroute capacity by changing one number and the others absorb it — there is no column to keep summing to 1.0 by hand.

How it decides

    provider ──▶ reading ──▶ epoch ──▶ ledger ──▶ facts ──▶ policy chain ──▶ decision
   (vendor's     (windows,   (one      (per-       (pure     (worst          (verdict,
    authority)   freshness)  window    project     data)     verdict          reason,
                             instance) points)               wins)            retry)

Every policy rules on every request and the worst verdict wins — not the first match. With first-match, correctness depends on the order of a list in a config file, and reordering it to "put the cheap checks first" can silently let a budget policy be pre-empted. With worst-wins, no ordering of any policy set can produce a more permissive answer than its strictest member.

overton explain <project> <account> prints every fact behind a decision.

Extending it

Three registries, one shape. Implement the interface, register it, name it in config.

Extend To add Docs
Provider a new vendor's windows (Gemini, Copilot, Qwen, Kiro…) docs/02-providers.md
CostSource a new transcript format to attribute by docs/02-providers.md
Policy a rule of your own — quiet hours, per-model caps, cost ceilings docs/03-policies.md

A policy you add cannot accidentally weaken the built-ins. It can only tighten them, because of worst-wins.

What it deliberately is not

  • A harness. It never invokes an agent. overton run spawns your command and gets out of the way.
  • An orchestrator. No tickets, no worktrees, no merge queue.
  • A fleet TUI. overton status is a table, not a dashboard.
  • A proxy. Your credentials are never routed through it; it reads them to ask the vendor about your own usage, nothing more.
  • Multi-user. Tailscale is the perimeter. It binds loopback and has no auth.

Honesty rules

A budget arbiter that is confidently wrong is worse than none, so:

  • Unknown is never reported as zero. A provider that cannot reach its source says so. "Unknown" and "0% used" produce opposite decisions.
  • A degraded reading may only tighten a gate, never open one. Enforced mechanically, with a property test over the whole freshness ladder.
  • Attribution admits what it guessed. The vendor gives one number per account; splitting it across projects is inference. Every ledger entry records its method, and SUM(pct_delta) always equals the observed delta exactly — we may be wrong about who spent it, never about how much.
  • A rollover is detected, never assumed. A bare utilization drop with an unchanged reset instant is a bad reading, not a fresh window — treating it as one discards a week of attribution and opens every gate on the account.

These are stated as executable rules in docs/05-invariants.md and tested in test/.

Where it came from

Overton is the quota half of Loopdeck2, extracted and rewritten. Loopdeck2 tried to be a whole control plane — workflows, GitHub, dispatch, a deck — and the ecosystem shipped better versions of all of it during 2026. What nobody shipped, across ~200 orchestrators surveyed, was allocating a share of a rolling subscription window to a project and enforcing it. Paperclip has budgets in dollars; Quotio does per-account failover; LoopX gives per-goal hints; claudexor rotates between accounts on exhaustion. None of them keeps a per-(account, window, project) ledger.

So this is the part worth having, alone, small enough to adopt without adopting anything else.

The metering findings that make it possible — the Anthropic OAuth usage endpoint and its mandatory User-Agent, and the rate_limits block Codex writes into its rollout JSONL — are documented in docs/02-providers.md.

Docs

01 — Concepts Windows, epochs, shares, pacing, claims, the decision
02 — Providers How metering works per vendor, and how to add one
03 — Policies The chain, and writing a rule of your own
04 — Integration Recipes: Symphony, Paperclip, Actions, shell, MCP
05 — Invariants The rules that must not regress

Status

v0.1 — working, and young. Metering, attribution, allocation, gating, claims, CLI, HTTP and MCP all run against real accounts. 51 tests.

Not yet: remote workers, more providers than the three here, or any UI beyond a terminal table. Issues and PRs welcome — especially new providers.

License

MIT © Ignacio Freiberg

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选