projectstate
Per-project memory for AI agents: decisions, attempts, tasks, ranked recall. Paid per call via x402.
使うべきか
品質と安全性
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"projectstate": {
"url": "https://projectstate.online/mcp"
}
}
}リモートエンドポイント
https://projectstate.online/mcpstreamable-httpできること
ツール一覧
ツール(6)
🟢project_open(project, name, description)
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 '.').
入力スキーマ
{
"type": "object",
"properties": {
"project": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Project"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Name"
},
"description": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Description"
}
},
"title": "project_openArguments"
}出力スキーマ
{
"type": "object",
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "project_openOutput"
}🟢project_status(project, set_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.
入力スキーマ
{
"type": "object",
"properties": {
"project": {
"title": "Project",
"type": "string"
},
"set_status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Set Status"
}
},
"required": [
"project"
],
"title": "project_statusArguments"
}出力スキーマ
{
"type": "object",
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "project_statusOutput"
}🟡remember(project, kind, title, body, tags, ...)
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.
入力スキーマ
{
"type": "object",
"properties": {
"project": {
"title": "Project",
"type": "string"
},
"kind": {
"title": "Kind",
"type": "string"
},
"title": {
"title": "Title",
"type": "string"
},
"body": {
"default": "",
"title": "Body",
"type": "string"
},
"tags": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Tags"
},
"files": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Files"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"supersedes": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Supersedes"
},
"idempotency_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Idempotency Key"
}
},
"required": [
"project",
"kind",
"title"
],
"title": "rememberArguments"
}出力スキーマ
{
"type": "object",
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "rememberOutput"
}🟢recall(project, query, kind, status, tags, ...)
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(...).
入力スキーマ
{
"type": "object",
"properties": {
"project": {
"title": "Project",
"type": "string"
},
"query": {
"default": "",
"title": "Query",
"type": "string"
},
"kind": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Kind"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"tags": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Tags"
},
"files": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Files"
},
"limit": {
"default": 5,
"title": "Limit",
"type": "integer"
},
"max_chars": {
"default": 1500,
"title": "Max Chars",
"type": "integer"
}
},
"required": [
"project"
],
"title": "recallArguments"
}出力スキーマ
{
"type": "object",
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "recallOutput"
}🟡plan_check(project, intent, files, limit, max_chars)
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.
入力スキーマ
{
"type": "object",
"properties": {
"project": {
"title": "Project",
"type": "string"
},
"intent": {
"title": "Intent",
"type": "string"
},
"files": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Files"
},
"limit": {
"default": 3,
"title": "Limit",
"type": "integer"
},
"max_chars": {
"default": 1200,
"title": "Max Chars",
"type": "integer"
}
},
"required": [
"project",
"intent"
],
"title": "plan_checkArguments"
}出力スキーマ
{
"type": "object",
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "plan_checkOutput"
}🟡update(project, id, status, title, body, ...)
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.
入力スキーマ
{
"type": "object",
"properties": {
"project": {
"title": "Project",
"type": "string"
},
"id": {
"title": "Id",
"type": "integer"
},
"status": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Status"
},
"title": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Title"
},
"body": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Body"
},
"append": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Append"
},
"tags": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Tags"
},
"files": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"default": null,
"title": "Files"
},
"delete": {
"default": false,
"title": "Delete",
"type": "boolean"
}
},
"required": [
"project",
"id"
],
"title": "updateArguments"
}出力スキーマ
{
"type": "object",
"properties": {
"result": {
"title": "Result",
"type": "string"
}
},
"required": [
"result"
],
"title": "updateOutput"
}コミュニティ
エビデンス