projectstate

online.projectstate由 projectstate.online 发布官方发布者v0.3.0更新于 Oct 28, 2026

Per-project memory for AI agents: decisions, attempts, tasks, ranked recall. Paid per call via x402.

已验证Streamable HTTP可网页运行效率与工作流知识与记忆

概览

AI 生成的概览

面向 AI 智能体的项目级记忆:保存决策、尝试与任务,并按相关度在字数预算内召回;通过 x402 按次以 USDC 付费。

可以做什么
  • 打开或创建项目,获取包含状态、未完成任务、生效决策与失败尝试的简要概览
  • 读取或覆盖项目的一行状态,作为会话之间的交接说明
  • 保存决策、尝试、任务和笔记,可带标签与文件引用
  • 按关键词检索项目记忆,可按类型、状态、标签和文件过滤,并裁剪到指定字符预算
  • 在开始非平凡工作前,用计划意图对照既往失败、仍生效的决策和重叠任务
  • 更新或删除已有条目:关闭任务、标记尝试结果、取代旧决策
适用场景
适合多个智能体或会话(编码助手、CI 智能体、脚本)同时处理同一代码仓库,需要共享一份精简记录,说明做过什么决定、哪些尝试失败、还有什么未完成。plan_check 用于在动手前避免重复踩坑。
运行要求
远程 Streamable HTTP 端点,无需账号或 API 密钥。需要支持 x402 的客户端和可在 Base 主网上签署 USDC 付款的加密钱包,因为每次调用都要付费;首次付款后可复用信用令牌作为 Bearer 凭证。
安装前请注意
每次工具调用都需支付 USDC(约每次 0.002 至 0.010 美元),智能体可能自行花钱;客户端需要钱包签名密钥。付款与存储的项目信息都会发送给 Base 主网上的第三方服务。update 工具可覆盖或删除已有条目。

安装

在 SourceWeft 中

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

Web executable,通过 Streamable HTTP。 远程服务在工作区中配置后即可从网页运行时运行。

交给智能体安装

把这段提示词粘贴到 Claude Code、Codex、Cursor 等智能体,或 SourceWeft 对话中。智能体会读取该服务器的安装指南,先向你展示发布者、端点和登录方式,经你同意后再把它添加到你的客户端。密钥不会写进任何命令。

阅读 https://sourceweft.com/mcp/online.projectstate%2Fprojectstate/install.md,并按其中说明把这个 MCP 服务器接入我的客户端。修改任何配置之前,先告诉我它的发布者、端点和登录方式,等我确认。不要把 API 密钥写进命令或我会提交的文件;问我密钥应从哪里获取。

查看智能体所依据的安装指南

其他 MCP 客户端

把它添加到你客户端的 mcpServers 配置中。

{
  "mcpServers": {
    "projectstate": {
      "type": "http",
      "url": "https://projectstate.online/mcp"
    }
  }
}

README

projectstate

Persistent project memory for AI agents, paid per call in USDC over x402. No account, no API key.

https://projectstate.online/mcp — an MCP server (Streamable HTTP) that remembers, per project, what was decided, what was tried and failed, and what is still open, and hands an agent back the three facts it needs instead of the whole history.

Why

Every agent already has "memory". What it does not have is project state that survives across tools and sessions: Claude Code, Cursor, a CI agent and a script all working on the same repo, sharing one ranked, compact record of decisions and dead ends. That is what this is. Retrieval is the point: recall returns at most a few lines inside a character budget, ranked so superseded decisions sink and active ones float.

Tools

ToolDoesPrice
project_open(project, name?, description?)open/create a project; returns a brief: status, open tasks, latest decisions, failed attempts$0.002
project_status(project, set_status?)read or set the one-line status (hand-off note between sessions)$0.002
remember(project, kind, title, body?, tags?, files?, status?, supersedes?, idempotency_key?)store a decision, attempt, task or note$0.002
recall(project, query?, kind?, status?, tags?, files?, limit=5, max_chars=1500)ranked keyword search, trimmed to a budget$0.005
plan_check(project, intent, files?, limit=3, max_chars=1200)say what you are about to do; get back the failed attempts, binding decisions and overlapping tasks that would change the plan$0.010
update(project, id, status?, title?, body?, append?, tags?, files?, delete?)close tasks, mark attempts, supersede decisions$0.002

Failed calls are free. Identical retries (or any call with the same idempotency_key) are never billed twice. Prices are published per tool in tools/list under _meta.priceUsd.

plan_check

The tool to call before starting something non-trivial:

plan_check(project="my-app", intent="switch the session cache to Redis", files=["src/cache.py"])
Plan check for 'my-app': 'switch the session cache to Redis'Prior failures (1):  #8 attempt/failed (2026-09-12): Tried Redis for the session cache — connection pool exhausted under loadActive decisions that constrain this (1):  #9 decision/active (2026-09-12): Cache with SQLite instead of Redis — one less service to runOpen tasks that overlap (1):  #10 task/open (2026-09-12): Benchmark the cache options

Three targeted searches in one call, returning only what would change the plan. A clean plan answers "Nothing on record matches this plan" so the agent can proceed without a second lookup.

How paying works

  1. Call a tool. Without credit the result is isError: true with an x402 v2 PaymentRequired in structuredContent (scheme exact, USDC on Base, the amount, the pay-to address).
  2. Sign the USDC payment and retry the same call with the payload in _meta["x402/payment"].
  3. The result carries the settlement receipt in _meta["x402/payment-response"] and a credit token in _meta["projectstate/x402-credit"].
  4. One payment buys credit ($0.10 on a session-based connection, $0.01 minimum per call without one). Later calls draw from it automatically on a session, or by sending the credit token as Authorization: Bearer xc_…. Unused credit stays on your wallet address.

Works with any x402-capable client: x402-mcp (withPayment()) for the Vercel AI SDK, the x402 Python package, or the 30-line handshake in scripts/x402_agent_demo.py.

python
from eth_account import Accountfrom mcp import Clientfrom x402 import x402Clientfrom x402.mechanisms.evm.exact import register_exact_evm_clientfrom x402.mechanisms.evm.signers import EthAccountSignerfrom x402.schemas import PaymentRequired
x = x402Client(); register_exact_evm_client(x, EthAccountSigner(Account.from_key(KEY)))async with Client("https://projectstate.online/mcp") as mcp:    r = await mcp.call_tool("project_open", {"project": "my-app"})       # -> PaymentRequired    pay = (await x.create_payment_payload(PaymentRequired(**r.structured_content))).model_dump(by_alias=True, exclude_none=True)    r = await mcp.call_tool("project_open", {"project": "my-app"}, meta={"x402/payment": pay})    token = r.meta["projectstate/x402-credit"]                          # reuse on later calls

What is under the hood

Python 3.12, the official MCP Python SDK (v2), SQLite + FTS5 (bm25, no vectors), the official x402 package against the Coinbase facilitator on Base mainnet. One process, one SQLite file, an admin dashboard with per-tool latency, error messages, a full audit ledger and a retrieval-quality meter (zero-hit and re-query rates) that says when keyword search stops being enough.

Docs: https://projectstate.online/docs · Registry: online.projectstate/projectstate · License: MIT

Run your own

deploy/install.sh sets up systemd, nginx, fail2ban, hourly SQLite backups and unattended upgrades on a small Ubuntu VPS; deploy/env.example lists every setting; deploy/x402_live_setup.sh switches the x402 rail to Base mainnet with Coinbase CDP keys. pytest tests/ runs 33 tests including a mock x402 facilitator that verifies real EIP-712 signatures.

来源:README.md,提交 a8db121

工具

6

project_open

Open project

Open (or create) a project and get a compact brief: status line, open tasks, latest active decisions and failed attempts. Call this first in a session. Omit `project` to list your projects. `project` is a slug like 'my-app' (lowercase, digits, '-', '_' or '.').

输入参数nameprojectdescription

project_status

Project status

Get the project's one-line status, open tasks and last change. Pass `set_status` to overwrite the status line (e.g. 'v0.3 shipped; next: migrate auth to OAuth'). Cheap; use it for handoff notes between sessions.

输入参数project必填set_status

remember

Remember

Store one fact about the project. `kind` is one of: decision (what was chosen and why), attempt (something tried; status 'worked'|'failed'|'partial'), task (status 'open'|'done'|'dropped'), note (anything else). `title` is one line; put details, reasons and error messages in `body`. `files` lists related paths. `supersedes` marks an older decision/task as replaced by this one. Identical content is stored once, so retries are safe; `idempotency_key` additionally guarantees a retry is not billed twice.

输入参数bodykind必填tagsfilestitle必填statusproject必填supersedesidempotency_key

recall

Recall

Search the project's memory with keywords and get the few most relevant entries (ranked, active entries first, superseded ones last), trimmed to `max_chars`. Use 2-5 specific keywords (e.g. 'auth token expiry'). Filters: kind (decision|attempt|task|note), status, tags, files. Omit `query` for the most recent entries. Follow up with update(project, id, ...) or remember(...).

输入参数kindtagsfileslimitquerystatusproject必填max_chars

plan_check

Plan check

Before you start something non-trivial, say what you are about to do and get back only what would change your mind: attempts that already failed at this, decisions that are still in force and constrain it, and open tasks that overlap. `intent` is one line in plain words, e.g. 'switch the cache to Redis' or 'rewrite the auth middleware to use refresh tokens'. Pass `files` if you know which paths you will touch; entries about those files are included even when the wording differs. Cheaper than repeating work that already failed once.

输入参数fileslimitintent必填project必填max_chars

update

Update entry

Change an existing entry by id: set `status` (task open|done|dropped, attempt worked|failed|partial, decision active|superseded|reverted, note active|archived), replace `title`/`body`, `append` a line to the body (e.g. an outcome), replace `tags`/`files`, or `delete` it.

输入参数id必填bodytagsfilestitleappenddeletestatusproject必填

版本历史

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

评分

已满足适用检查项的 100%

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

  • 近 30 天内可连通必需25 分
  • 已声明认证方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分