原型 · 预览版:收录官方注册中心里的全部服务器,每 30 分钟同步一次。评价和账户功能将在后续阶段推出。
PopNx MCP为使用 AI 的人准备的 MCP 服务器 · 用大白话讲清楚

agenthold

作者:edobusy版本 0.10.0i★ –i在你的电脑上运行
注册名称io.github.edobusy/agenthold

安装

概览

作者提供的说明(英文原文)

Shared versioned state for multi-agent AI workflows

PopNx MCP 的三大支柱

这三项永远不会合并成一个分数:意见、测量和人气是不同的东西。

它能帮你做什么

我们还没有为它写通俗的介绍。下面是我们从注册中心读取到的事实。

  • 连接方式: 在你的电脑上运行
  • 传输方式: stdio
  • 分类: 其他

安装

选择你使用的 AI 应用,然后复制设置。

安装之前

  • 基础检查:1 项中通过 1 项
  • 在你的电脑上运行,拥有你的用户账户的权限(文件、网络、应用)。
  • 注册中心没有列出需要填写的密钥。

你需要

  • PyPI已安装 Python 的 uv(用于 uvx 命令)

你用的是哪个应用?

在上方选择你的应用。我们会记住它,下次按钮会显示“安装到 …”。

打开 Claude Desktop → Settings → Developer → Edit Config,把下面的内容粘贴到 claude_desktop_config.json

{
  "mcpServers": {
    "agenthold": {
      "command": "uvx",
      "args": [
        "agenthold",
        "--tools",
        "standard",
        "--db",
        "./agenthold.db",
        "--transport",
        "stdio",
        "--host",
        "127.0.0.1",
        "--port",
        "8417"
      ]
    }
  }
}

在终端中运行这条命令

claude mcp add agenthold -- uvx agenthold --tools standard --db ./agenthold.db --transport stdio --host 127.0.0.1 --port 8417

在 Cursor 中打开

或者自己复制设置

粘贴到项目中的 .cursor/mcp.json,或 ~/.cursor/mcp.json

{
  "mcpServers": {
    "agenthold": {
      "command": "uvx",
      "args": [
        "agenthold",
        "--tools",
        "standard",
        "--db",
        "./agenthold.db",
        "--transport",
        "stdio",
        "--host",
        "127.0.0.1",
        "--port",
        "8417"
      ]
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

在 VS Code 中打开

或者自己复制设置

粘贴到项目中的 .vscode/mcp.json

{
  "servers": {
    "agenthold": {
      "type": "stdio",
      "command": "uvx",
      "args": [
        "agenthold",
        "--tools",
        "standard",
        "--db",
        "./agenthold.db",
        "--transport",
        "stdio",
        "--host",
        "127.0.0.1",
        "--port",
        "8417"
      ]
    }
  }
}

浏览器会先询问是否打开应用,然后应用会显示设置并请你确认。密钥的值会留空,由你自己填写。

这个服务器在你的电脑上运行,而 ChatGPT 只能连接互联网上的服务器。请选择其他应用。

你的选择通过 Cookie 保存在这台设备上,无需账户。

这些设置是根据作者在注册中心的条目生成的。如果 README 的写法不同,请以 README 为准。

它能做什么

它在你的电脑上运行;安装后,工具列表会显示在你的 AI 应用中。

基础检查i

我们检查的是任何人都能看到的信息;我们没有阅读代码。不适用的检查项不计入总数。 · 检查于 2026年11月7日

  • ✓ 通过

    作者与仓库一致

    注册名称已通过 GitHub 账户 edobusy 验证,该账户拥有此仓库

  • … 尚未检查

    仍在维护

    我们还没有从 GitHub 读取这个仓库

  • … 尚未检查

    有许可证

    我们还没有从 GitHub 读取这个仓库

  • – 不适用

    端点有响应

    它在你的电脑上运行,没有互联网端点

  • – 不适用

    使用 OAuth 登录

    在你的电脑上运行,改用本地设置

  • … 尚未检查

    工具描述中没有隐藏指令

    它在你的电脑上运行;我们只能读取互联网端点的工具列表

与“其他”中的其他服务器比较i

  • 星标数多于此分类中其他 32583 个服务器的 0%
  • 发布到注册中心的时间比此分类中其他 32583 个服务器的 16% 更新
  • 基础检查结果等于或优于此分类中其他 32583 个服务器的 100%

与注册中心里这个分类中所有活跃的服务器比较。只有当发布者拥有该仓库时,星标数才计入。

常见问题

agenthold 安全吗?

它在 1 项适用的基础检查中通过了 1 项。我们没有阅读代码。在添加密钥或令牌之前,请先看看这个服务器要求哪些权限,并使用只具备所需权限的密钥。

它需要哪些密钥或代码?

注册中心没有列出必需的密钥,不过有些服务器会在首次使用时要求你登录。

它在我的电脑上运行还是在云端?

它在你的电脑上运行。你的 AI 应用会在需要时启动它,数据不会经过作者的服务器(除非它自己调用在线服务)。

它还在维护吗?

GitHub 仓库最后更新于–,最新版本(0.10.0)于4个月前进入注册中心。

哪些应用可以使用它?

支持 MCP 的应用,例如 Claude Desktop、Claude Code、Cursor 和 VS Code。你的电脑上还需要有 Python (uv)。

有什么可以替代它?

同一分类中有:Spec Driven Development, Remote Desktop Commander, sync. labs

替代选择

同一分类中其他作者的服务器,按星标数排序。

如何看卡片:★ GitHub 星标i三大支柱:评价 · 检查 · 使用情况i更新 = 最新版本发布到注册中心的时间i

Spec Driven Development

作者:formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

在你的电脑上运行★ 440MIT14个月前更新
安装

Remote Desktop Commander

作者:desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

在云端运行★ 211昨天更新
安装

sync. labs

作者:synchronicity-labs

Lipsync videos, dub them into other languages, make talking videos and open sync. Studio.

电脑或云端今天更新
安装

作者的 README

打开 README

按原文从作者的仓库复制。PopNx MCP 没有审查或背书其内容。HTML、图片和脚本已被移除。链接会离开本站。

agenthold

Stop your AI agents from silently overwriting each other.

When two agents update the same value, the second write quietly destroys the first. No error, no exception, just wrong data and a system that keeps running. agenthold is an MCP server that gives agents shared, versioned state with conflict detection built in. Think of it as git for your agents' working memory.


The problem

When two agents update the same value at the same time, the second write silently overwrites the first. No exception is raised. The value is wrong. The system keeps running.

Two agents read a $10,000 budget and allocate from it independently. Total committed: $15,000. The budget object never complains. This is a read-modify-write conflict: each agent's write assumes nothing changed since its read.


How it works

agenthold solves this with optimistic concurrency control (OCC), the same mechanism Postgres uses in UPDATE ... WHERE version = N and DynamoDB uses in conditional writes.

Every value stored in agenthold has a version number. When an agent writes, it passes the version it read. If the stored version has changed since the read, the write is rejected with a ConflictError that includes the current value. The agent re-reads, recalculates, and retries.

The losing agent detects the conflict, re-reads the real remaining budget ($2,000), and adjusts its allocation. The total committed is always exactly $10,000. Every write is tracked.

OCC is the right fit for agent workflows because:

  • Agents do work between reads and writes (network calls, LLM inference). You cannot hold a database lock across that work.
  • Conflicts are rare. Retrying once is cheaper than acquiring a lock on every read.
  • The retry logic is simple, explicit, and fully in the agent's control.

Works with any agent framework

agenthold connects via MCP (Model Context Protocol), the open standard for tool integration. Any framework that speaks MCP can use agenthold with zero glue code.

FrameworkHow to connect
Claude Desktop / Claude CodeBuilt-in: add to mcpServers config
Cursor / Continue / WindsurfBuilt-in: add to MCP config
LangChain / LangGraphlangchain-mcp-adapters
CrewAINative mcps field on Agent
OpenAI Agents SDKBuilt-in mcp_servers param
Google ADKBuilt-in MCP Toolbox
AutoGenautogen_ext.tools.mcp
PydanticAINative MCP integration

agenthold is not a framework. It is shared infrastructure that sits underneath your orchestration layer, the same way a database sits underneath your application. Your agents keep their existing tools and logic; agenthold adds the coordination primitive they are missing.

Not using MCP yet? agenthold also works as a Python library you can call directly from any framework. Import StateStore, call .get() and .set() with version checks, and you have conflict-safe shared state.


Architecture

graph LR

A1["Agent 1 LangChain, CrewAI, etc."] -->|MCP| S["agenthold MCP Server"] A2["Agent 2 Claude, OpenAI, etc."] -->|MCP| S A3["Agent 3 AutoGen, ADK, etc."] -->|MCP| S S --> DB[("SQLite WAL mode")] DB -->|version 3| S S -->|"conflict! retry"| A2

Every write carries a version number. If the stored version has changed since an agent's read, the write is rejected and the agent retries with current data. This is the same mechanism used by Postgres conditional updates and DynamoDB conditional writes.


Quick start

1. Install
pip install agenthold

or

uv pip install agenthold

2. Add to your MCP client config
{

"mcpServers": { "agenthold": { "command": "agenthold", "args": ["--db", "/path/to/state.db"] } } }

3. Done

Agents automatically coordinate. No CLAUDE.md, no system prompt changes, no namespace design.

When an agent connects, it sees five self-documenting tools: agenthold_register, agenthold_claim, agenthold_release, agenthold_status, and agenthold_wait. The tool descriptions tell the agent when and how to use each one. Server instructions reinforce the protocol when the MCP client includes them.


Resources

agenthold identifies resources by canonical URIs. Tools accept either form:

  • Bare path (e.g. "src/main.py") — resolves against the workspace named default, or the only configured workspace if exactly one exists.
  • Explicit URI — "file:// / " for files, "custom:// " for opaque resources.

Equivalent inputs (./src/main.py, src\main.py, src//main.py, an absolute path inside the workspace) all canonicalize to the same internal URI, so two agents using different shorthands never fragment the keyspace. Path traversal (..) and dot segments (.) are rejected at the boundary.

On case-insensitive filesystems (Windows and macOS by default), file resources are matched case-insensitively, so src/Main.py and src/main.py resolve to the same resource — two agents can't both claim the same physical file. This follows the running platform; custom:// names are always case-sensitive.

Configure workspaces with --workspace name=path (repeatable). With no flag, agenthold creates a single default workspace at the current working directory. Multi-workspace setups let one agenthold process coordinate across separate codebases.


Tools

agenthold exposes five coordination tools by default.

agenthold_register

Register yourself and receive a unique agent ID. Must be called once before using agenthold_claim or agenthold_release.

{ "name": "editor-agent", "model": "claude-sonnet-4-6" }
{

"status": "registered", "agent_id": "agent-a1b2c3d4", "name": "editor-agent", "registered_at": "2026-03-18T10:00:00+00:00" }


agenthold_claim

Claim exclusive access to a resource before modifying it. Requires a registered agent_id.

{ "resource": "intro.md", "agent_id": "agent-a1b2c3d4" }

Claimed (you hold exclusive access):

{ "status": "claimed", "resource": "file://default/intro.md", "version": 1 }

If the resource has a non-trivial prior history (deleted, moved, abandoned, or expired), the response also carries previous_outcome, previous_holder, previous_outcome_at, and a hint describing what the previous holder did. For previous_outcome: "moved", moved_to is the new resource URI.

Busy (another agent is working on this resource):

{

"status": "busy", "resource": "file://default/intro.md", "held_by": "agent-e5f6g7h8", "claimed_at": "2026-03-18T10:00:00+00:00", "hint": "Another agent holds this resource. Work on a different resource, or call agenthold_wait to be notified when it becomes available." }

Already claimed (you already hold this claim, idempotent):

{ "status": "already_claimed", "resource": "file://default/intro.md", "version": 1 }

agenthold_release

Release your claim with an explicit outcome describing what you did. The outcome is preserved in the free-state record and shown to the next claimant so they don't act on stale assumptions. Requires a registered agent_id.

{

"resource": "intro.md", "agent_id": "agent-a1b2c3d4", "outcome": "modified" }

{ "status": "released", "resource": "file://default/intro.md", "version": 2, "outcome": "modified" }

Outcomes: released (default — no lifecycle claim), modified (changed in place), created (didn't exist before), deleted (no longer exists at this resource), moved (relocated — also pass moved_to with the new resource).

For renames (mv old new): claim BOTH paths, do the rename on disk, then release the source with outcome: "moved", moved_to: "new" and the destination with outcome: "created".


agenthold_status

Check whether a resource is available or currently claimed. Does not require registration.

{ "resource": "intro.md" }

Available:

{ "status": "available", "resource": "file://default/intro.md" }

If a previous holder declared a non-trivial outcome (deleted, moved, abandoned, expired), the response also includes previous_outcome, previous_holder, previous_outcome_at, and a hint. For moved, moved_to is the new resource URI.

Claimed:

{

"status": "claimed", "resource": "file://default/intro.md", "held_by": "agent-e5f6g7h8", "agent_name": "editor-agent", "agent_model": "claude-sonnet-4-6", "claimed_at": "2026-03-18T10:00:00+00:00", "version": 3 }


agenthold_wait

Wait for a claimed resource to become available. Blocks the agent turn until the holder releases, or the timeout expires.

{ "resource": "intro.md", "timeout_seconds": 30 }

Available (resource was released):

{ "status": "available", "resource": "file://default/intro.md", "elapsed_seconds": 2.4 }

When the wait fires on a release with a non-trivial outcome, the response also carries previous_outcome, previous_holder, previous_outcome_at, optional moved_to, and a hint. An agent that was waiting to edit a moved or deleted resource learns *why* the path became available.

Timeout:

{

"status": "timeout", "resource": "file://default/intro.md", "held_by": "writer-2", "elapsed_seconds": 30.2, "hint": "The resource was not released within the timeout. Try working on a different resource, or call agenthold_wait again with a longer timeout." }


Advanced tools

For custom coordination protocols, agenthold exposes eight low-level primitives via --tools advanced:

agenthold_get · agenthold_set · agenthold_list · agenthold_history · agenthold_delete · agenthold_watch · agenthold_clear_namespace · agenthold_export

These give agents direct read/write/watch access to the versioned state store with full OCC conflict detection. No server instructions are sent in this mode.

[See the full advanced tools reference →](docs/advanced-tools.md)


Conflict detection

The read-modify-write pattern with expected_version is the core of agenthold. Here is the canonical retry loop:

from agenthold.store import StateStore

from agenthold.exceptions import ConflictError

store = StateStore("./state.db")

record = store.get("campaign", "budget") # read once before doing work do_expensive_work() # LLM call,

只显示了开头部分;其余内容请在仓库中阅读

问 PopNx