projectstate

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

사용해야 할까요

품질 및 안전성

A
설명 품질
100%
스키마 완전성
67%
이름 품질
83%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~1,625토큰 (도구 정의)
~1.9 KB일반적인 응답 크기
중간 정도의 주의 영향 (128k 컨텍스트의 1.27%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`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"
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 6개
검증됨버전이 기록되지 않음도구 6개