guanling

guanling

A task-management MCP server that enforces strict gates on task states, WIP limits, and closing reasons, refusing operations that would leave the list ambiguous or rotting.

Category
访问服务器

README

guanling (關令)

A task-management MCP server that refuses.

Most task tools do what you tell them. This one has opinions and enforces them.


Why this exists

A real task list grew to 280 items. Sixteen were marked "in progress". Not one of them was actually being worked on.

The missing thing was not a tool — there already was a list. The missing thing was anything that forced a decision. Every operation said yes, so the list accumulated intentions and never spent them.

What makes Linear work is not its feature set. It is its refusals: a small fixed set of states you cannot extend, and limits you cannot argue with. This server copies the refusals, not the features.

The gates

Each one is a refusal, not a warning.

Gate Behaviour
owner and next_step required task_add is rejected without both. No owner and no next action means it is a wish, not a task.
Five states, hardcoded triage · todo · doing · done · dropped. There is no API to add a sixth. Custom statuses are how a list starts rotting.
WIP limit on doing Moving past the limit is rejected, and the error names what currently occupies it so you have to close something first.
External items land in triage Anything with a source starts in triage, never straight in todo.
Closing requires a reason done / dropped without reason is rejected. Why it closed outlives that it closed.
Rollover is visible cycle_roll increments a rolled counter and returns anything rolled 3+ times as needing a decision. Nothing is dropped silently.

Refused calls write nothing to disk — there is a test for this.

Install

npm install -g guanling

Then add it to your MCP client config:

{
  "mcpServers": {
    "guanling": {
      "command": "npx",
      "args": ["-y", "guanling"],
      "env": {
        "GUANLING_AGENT": "me",
        "GUANLING_FILE": "/path/to/my-tasks.json",
        "GUANLING_WIP": "3"
      }
    }
  }
}
Variable Default Meaning
GUANLING_AGENT unknown Identity for this instance.
GUANLING_FILE ~/.guanling/<agent>.json Path to the JSON store.
GUANLING_WIP 3 Maximum concurrent doing items.

⚠️ Give every instance its own GUANLING_FILE. Two processes sharing one file will overwrite each other — see Limitations.

Tools

Tool Purpose
task_add Open a task. Rejects without owner + next_step.
task_update Change status/owner/next_step. Enforces the WIP limit and the close-reason rule.
task_list List open work. stale_days surfaces tasks opened and never touched.
task_triage Resolve inbox items: accept / decline / duplicate / snooze.
cycle_status Days left, WIP usage, stale count, and what has rolled twice or more.
cycle_roll Close the cycle, carry unfinished work forward with a visible counter.

Storage

One JSON file, written atomically (write to a temp file, then rename).

Deliberately not a database. The scale is hundreds of rows, and a plain file stays readable by a human, diffable in git, and backed up by cp. The complete string is built before the file is opened, so an exception mid-serialisation leaves the previous file intact.

Tests

node selftest.mjs

16 arms, weighted toward the refusals — those are the product. Includes a negative control asserting that a rejected task_add leaves nothing on disk.

The WIP gate is mutation-tested: removing it turns exactly the two arms that cover it red. A gate that cannot be observed failing has not been verified.

Limitations

Stated up front rather than discovered later.

  • No concurrency lock. One process per store file. Two writers will clobber each other.
  • No cross-instance visibility. Each instance sees only its own file. This is intentional for per-agent isolation, but it means separate agents cannot see each other's work and may duplicate effort.
  • snooze sets snooze_until but nothing wakes it. Items do not return on their own; task_list is how you find them.
  • No history or audit trail. The file holds current state only.

The name

關令尹喜 was the gatekeeper at Hangu Pass. When Laozi tried to leave through it, the gatekeeper would not let him pass until he wrote his teaching down — which is why the Tao Te Ching exists.

Same idea: you do not get through until you write it down.

Privacy Policy

What is collected: nothing. Guanling has no telemetry, no analytics, no crash reporting, and no update check.

What is stored, and where: only the tasks you create — their title, owner, next step, status, optional source and blocker, timestamps, and close reason. They are written to a single JSON file on your own machine, at the path you configure (GUANLING_FILE, or ~/.guanling/<agent>.json by default). Nothing is written anywhere else.

Third-party sharing: none by guanling itself. The server makes no network requests: no HTTP client, no sockets, no telemetry. It uses four Node builtins — node:fs, node:path, node:crypto (to mint delegation nonces), and node:child_process.

⚠️ That last one matters and is stated plainly: if you configure GUANLING_SEND_CMD, guanling executes your command and pipes a delegation payload to it on stdin. Whatever that command does with the payload — including sending it over a network — is outside guanling and is your choice. With the variable unset, delegation is refused and nothing is ever executed.

(Earlier releases of this file claimed two builtins. That stopped being true in 1.1.0 when delegation was added, and the sentence was not updated until 1.4.0.)

Data retention: entirely yours. The file persists until you delete it. Guanling never expires, prunes, or deletes data on its own — closing a task marks it done or dropped and keeps the record. To erase everything, delete the JSON file.

Your control: the store is plain JSON. You can read it, edit it, copy it, back it up, or delete it with ordinary file tools. No export feature is needed because the file is the export.

Contact: open an issue at https://github.com/fateLiang/guanling/issues.

License

MIT

推荐服务器

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 模型以安全和受控的方式获取实时的网络信息。

官方
精选