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 分