Hosted shared memory for AI apps: project decisions, to-dos and learnings. Beta.
Maintained by@dialectforge(verified)Also a maintainer?
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Record one new decision (a choice and why), change (code or setup), problem (bug or blocker), learning (reusable lesson) or todo in a project. To update todos or problems: manage_todos / manage_problems. Only adds. Review mode or suggested=true may queue it for the user. A change on a shared component alerts linked projects. A decision close to a current one gets a possible-conflict note; act on it. conflicts_with opens a disagreement card. Secrets are refused. Returns {logged, record, note} or {queued_for_review}.
The record kind (see the description).
Project name or id. Required.
The record in one short line.
Model name if known. Never guess.
Short topic, e.g. API sessions.
user_stated, ai_inferred or from_code.
Why, or old and new values. Max 10,000 chars.
learning only: the kind of lesson.
Up to 2: file:line, or output:/url:/tool: text.
todo or problem. Default normal.
Decision id this one replaces.
Component name; created if missing. Shared ones too.
true = queue it for the user's review.
Record id this disagrees with.
Default decision.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http flowstate-hosted https://hosted.flowstatemcp.com/mcp
Record one new decision (a choice and why), change (code or setup), problem (bug or blocker), learning (reusable lesson) or todo in a project. To update todos or problems: manage_todos / manage_problems. Only adds. Review mode or suggested=true may queue it for the user. A change on a shared component alerts linked projects. A decision close to a current one gets a possible-conflict note; act on it. conflicts_with opens a disagreement card. Secrets are refused. Returns {logged, record, note} or {queued_for_review}.
| Argument | Type | Description |
|---|---|---|
| kind* | string | The record kind (see the description). |
| model | string | Model name if known. Never guess. |
| topic | string | Short topic, e.g. API sessions. |
| source | string | user_stated, ai_inferred or from_code. |
| details | string | Why, or old and new values. Max 10,000 chars. |
| project* | string | integer | Project name or id. Required. |
| summary* | string | The record in one short line. |
| category | string | learning only: the kind of lesson. |
| evidence | array | Up to 2: file:line, or output:/url:/tool: text. |
| priority | string | todo or problem. Default normal. |
| replaces | integer | Decision id this one replaces. |
| component | string | Component name; created if missing. Shared ones too. |
| suggested | boolean | true = queue it for the user's review. |
| conflicts_with | integer | Record id this disagrees with. |
| conflicts_with_type | string | Default decision. |
{
"type": "object",
"required": [
"project",
"kind",
"summary"
],
"properties": {
"kind": {
"enum": [
"decision",
"change",
"problem",
"learning",
"todo"
],
"type": "string",
"description": "The record kind (see the description)."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"topic": {
"type": "string",
"description": "Short topic, e.g. API sessions."
},
"source": {
"enum": [
"user_stated",
"ai_inferred",
"from_code"
],
"type": "string",
"description": "user_stated, ai_inferred or from_code."
},
"details": {
"type": "string",
"description": "Why, or old and new values. Max 10,000 chars."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required."
},
"summary": {
"type": "string",
"description": "The record in one short line."
},
"category": {
"enum": [
"pattern",
"gotcha",
"best_practice",
"tool_tip",
"architecture",
"performance",
"security",
"other"
],
"type": "string",
"description": "learning only: the kind of lesson."
},
"evidence": {
"type": "array",
"items": {
"type": "string"
},
"description": "Up to 2: file:line, or output:/url:/tool: text."
},
"priority": {
"enum": [
"critical",
"urgent",
"high",
"normal",
"medium",
"low"
],
"type": "string",
"description": "todo or problem. Default normal."
},
"replaces": {
"type": "integer",
"description": "Decision id this one replaces."
},
"component": {
"type": "string",
"description": "Component name; created if missing. Shared ones too."
},
"suggested": {
"type": "boolean",
"description": "true = queue it for the user's review."
},
"conflicts_with": {
"type": "integer",
"description": "Record id this disagrees with."
},
"conflicts_with_type": {
"enum": [
"project",
"component",
"decision",
"change",
"learning",
"problem",
"todo"
],
"type": "string",
"description": "Default decision."
}
}
}Notes from one AI to the next. leave: when you must stop mid-task, save where_i_was and next_step; the next start_here shows it after the hard rules. pickup: once you continue from a note, mark it so it stops showing. list: open notes. Not a session summary and not a todo. Adds or marks notes; never deletes. Returns the note or {notes}.
| Argument | Type | Description |
|---|---|---|
| limit | integer | list: max notes. Default 20. |
| model | string | Model name if known. Never guess. |
| action* | string | The operation; see the tool description. |
| project* | string | integer | Project name or id. Required. |
| next_step | string | leave: the next step. Max 500 chars. |
| handoff_id | integer | pickup: the note id. |
| where_i_was | string | leave: progress so far. Max 1,000 chars. |
| include_picked_up | boolean | list: include picked-up notes. |
{
"type": "object",
"required": [
"action",
"project"
],
"properties": {
"limit": {
"type": "integer",
"description": "list: max notes. Default 20."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"action": {
"enum": [
"leave",
"pickup",
"list"
],
"type": "string",
"description": "The operation; see the tool description."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required."
},
"next_step": {
"type": "string",
"description": "leave: the next step. Max 500 chars."
},
"handoff_id": {
"type": "integer",
"description": "pickup: the note id."
},
"where_i_was": {
"type": "string",
"description": "leave: progress so far. Max 1,000 chars."
},
"include_picked_up": {
"type": "boolean",
"description": "list: include picked-up notes."
}
}
}The edit trail of records. list: edits with old and new values. undo: take back a record's last edit, a record you created (if nothing refers to it), or a delete with everything removed with it (a deleted project: its old name and id); rows changed since are skipped and listed. who: who did what (app, model, machine), filtered and paged. metrics: usage counts only (brief sizes, how often search and ask returned records). Logged changes (kind=change): find them with search. Reads: list, who, metrics. list and undo require project. Returns {history}, the undo result, or {rows, page}.
| Argument | Type | Description |
|---|---|---|
| page | integer | who: page number. Default 1. |
| limit | integer | list / who: max rows. Default 20, max 100. |
| model | string | Model name if known. Never guess. |
| since | string | who: from this local time, such as 2026-10-17. |
| until | string | who: up to this local time. |
| action* | string | The operation; see the tool description. |
| by_app | string | who: only apps whose name contains this. |
| project | string | integer | Project name or id. Required for list and undo; who: omit for all. |
| by_model | string | who: only models whose name contains this. |
| record_id | integer | list: only this record. undo: required. |
| by_machine | string | who: only this machine or workspace. |
| record_type | string | list: only this record type. undo: required. |
{
"type": "object",
"required": [
"action"
],
"properties": {
"page": {
"type": "integer",
"description": "who: page number. Default 1."
},
"limit": {
"type": "integer",
"description": "list / who: max rows. Default 20, max 100."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"since": {
"type": "string",
"description": "who: from this local time, such as 2026-10-17."
},
"until": {
"type": "string",
"description": "who: up to this local time."
},
"action": {
"enum": [
"list",
"who",
"undo",
"metrics"
],
"type": "string",
"description": "The operation; see the tool description."
},
"by_app": {
"type": "string",
"description": "who: only apps whose name contains this."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required for list and undo; who: omit for all."
},
"by_model": {
"type": "string",
"description": "who: only models whose name contains this."
},
"record_id": {
"type": "integer",
"description": "list: only this record. undo: required."
},
"by_machine": {
"type": "string",
"description": "who: only this machine or workspace."
},
"record_type": {
"enum": [
"todo",
"project",
"component",
"problem",
"solution",
"attempt",
"variable",
"method",
"attachment",
"link",
"learning",
"decision",
"change",
"rule",
"handoff"
],
"type": "string",
"description": "list: only this record type. undo: required."
}
}
}Connect things across projects. add: a project uses a shared component (link_type=uses, target_project, target_component), depends on a project, two components are the same, records relate, or a record gets a URL (e.g. an issue). Then a change or decision logged on the shared component (log_work component=<name>) gives each linked project an update todo and a 'changed since' line; FlowState never edits other projects. remove: by link_id or the add fields; kept as removed (manage_history undo, record_type=link). flag_conflict: two records disagree (topic, evidence); the user keeps one. list: read-only. Requires project. Returns the link, the card, or {links}.
| Argument | Type | Description |
|---|---|---|
| url | string | add: an https URL to attach to the source record. |
| note | string | add: a short note kept on the link. |
| model | string | Model name if known. Never guess. |
| topic | string | flag_conflict: what they disagree about, in plain words. |
| action* | string | The operation; see the tool description. |
| item_id | integer | Source: the record's id. |
| link_id | integer | remove: the link's id (from list); or give the add fields instead. |
| project* | string | integer | The source project, by name or id. Required. |
| evidence | array | flag_conflict: up to 2 snippets for the source record. |
| component | string | Source: a component of this project, by name. |
| item_type | string | Source: a record type, with item_id. |
| link_type | string | How the source relates to the target: uses, depends_on, part_of, same_as, supersedes, subtask_of, blocks, about, or url. |
| target_id | integer | add: the target record's id. |
| target_type | string | add: a target record type, with target_id. |
| target_project | string | integer | add: the target project, by name or id. |
| include_removed | boolean | list: also removed links. |
| target_evidence | array | flag_conflict: up to 2 snippets for the other record. |
| target_component | string | add: a component name in the target project. |
{
"type": "object",
"required": [
"action",
"project"
],
"properties": {
"url": {
"type": "string",
"description": "add: an https URL to attach to the source record."
},
"note": {
"type": "string",
"description": "add: a short note kept on the link."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"topic": {
"type": "string",
"description": "flag_conflict: what they disagree about, in plain words."
},
"action": {
"enum": [
"add",
"remove",
"list",
"flag_conflict"
],
"type": "string",
"description": "The operation; see the tool description."
},
"item_id": {
"type": "integer",
"description": "Source: the record's id."
},
"link_id": {
"type": "integer",
"description": "remove: the link's id (from list); or give the add fields instead."
},
"project": {
"type": [
"string",
"integer"
],
"description": "The source project, by name or id. Required."
},
"evidence": {
"type": "array",
"items": {
"type": "string"
},
"description": "flag_conflict: up to 2 snippets for the source record."
},
"component": {
"type": "string",
"description": "Source: a component of this project, by name."
},
"item_type": {
"enum": [
"project",
"component",
"decision",
"change",
"learning",
"problem",
"todo"
],
"type": "string",
"description": "Source: a record type, with item_id."
},
"link_type": {
"enum": [
"uses",
"depends_on",
"part_of",
"same_as",
"supersedes",
"subtask_of",
"blocks",
"about",
"url"
],
"type": "string",
"description": "How the source relates to the target: uses, depends_on, part_of, same_as, supersedes, subtask_of, blocks, about, or url."
},
"target_id": {
"type": "integer",
"description": "add: the target record's id."
},
"target_type": {
"enum": [
"project",
"component",
"decision",
"change",
"learning",
"problem",
"todo"
],
"type": "string",
"description": "add: a target record type, with target_id."
},
"target_project": {
"type": [
"string",
"integer"
],
"description": "add: the target project, by name or id."
},
"include_removed": {
"type": "boolean",
"description": "list: also removed links."
},
"target_evidence": {
"type": "array",
"items": {
"type": "string"
},
"description": "flag_conflict: up to 2 snippets for the other record."
},
"target_component": {
"type": "string",
"description": "add: a component name in the target project."
}
}
}Memory upkeep. cleanup: queue likely duplicate, stale and misfiled records. import: a memory export or edited FlowState markdown into review. stale: facts unchecked for 60+ days, and records flagged possibly stale. files_changed: paths you changed; flags records whose file evidence names them. mark_checked: you re-checked one (clears the flag). set_source: correct an origin (user_stated waits for the user). set_aside: no longer applies but kept (needs reason; out of brief and search; restore_set_aside or undo). delete: only when the user asks; undo restores it; with approvals on it waits for the user's approve (manage_review). Requires project. Returns counts and ids.
| Argument | Type | Description |
|---|---|---|
| days | integer | stale: unchecked for this many days. Default 60. |
| kind | string | import (memory format): record kind for each memory. Default learning. |
| text | string | import: the file contents. Max 200,000 chars. |
| kinds | array | cleanup: which checks. Omit for all three. |
| limit | integer | stale: max facts. Default 20. |
| model | string | Model name if known. Never guess. |
| paths | array | files_changed (required): the files you changed, repo-relative. |
| action* | string | The operation; see the tool description. |
| format | string | import: memory (default; one memory per line or bullet) or flowstate_markdown (an edited FlowState markdown export). |
| origin | string | import: where it came from, such as Claude or ChatGPT. |
| reason | string | set_aside (required): why the record no longer applies. |
| source | string | set_source (required) / mark_checked (optional): user_stated, ai_inferred or from_code. |
| project* | string | integer | Project name or id. Required. |
| record_id | integer | delete / mark_checked / set_source / set_aside / restore_set_aside: the record's id. |
| record_type | string | delete / mark_checked / set_source / set_aside / restore_set_aside: the record's type (all but delete: todo, decision, change, learning, problem, variable, method). |
{
"type": "object",
"required": [
"action",
"project"
],
"properties": {
"days": {
"type": "integer",
"description": "stale: unchecked for this many days. Default 60."
},
"kind": {
"enum": [
"learning",
"decision",
"todo",
"problem",
"change"
],
"type": "string",
"description": "import (memory format): record kind for each memory. Default learning."
},
"text": {
"type": "string",
"description": "import: the file contents. Max 200,000 chars."
},
"kinds": {
"type": "array",
"items": {
"enum": [
"duplicate",
"stale",
"misfiled"
],
"type": "string"
},
"description": "cleanup: which checks. Omit for all three."
},
"limit": {
"type": "integer",
"description": "stale: max facts. Default 20."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"paths": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 200,
"description": "files_changed (required): the files you changed, repo-relative."
},
"action": {
"enum": [
"stale",
"cleanup",
"import",
"mark_checked",
"set_source",
"set_aside",
"restore_set_aside",
"files_changed",
"delete"
],
"type": "string",
"description": "The operation; see the tool description."
},
"format": {
"enum": [
"memory",
"flowstate_markdown"
],
"type": "string",
"description": "import: memory (default; one memory per line or bullet) or flowstate_markdown (an edited FlowState markdown export)."
},
"origin": {
"type": "string",
"description": "import: where it came from, such as Claude or ChatGPT."
},
"reason": {
"type": "string",
"description": "set_aside (required): why the record no longer applies."
},
"source": {
"enum": [
"user_stated",
"ai_inferred",
"from_code"
],
"type": "string",
"description": "set_source (required) / mark_checked (optional): user_stated, ai_inferred or from_code."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required."
},
"record_id": {
"type": "integer",
"description": "delete / mark_checked / set_source / set_aside / restore_set_aside: the record's id."
},
"record_type": {
"enum": [
"decision",
"change",
"learning",
"todo",
"problem",
"attempt",
"handoff",
"rule",
"link",
"variable",
"method",
"attachment"
],
"type": "string",
"description": "delete / mark_checked / set_source / set_aside / restore_set_aside: the record's type (all but delete: todo, decision, change, learning, problem, variable, method)."
}
}
}Documented reusable procedures of a project (deploy, test, a code convention), with ordered steps. create, list (read), update (steps replaces the whole list; undo with manage_history), delete (undo restores it; with approvals on it waits for the user; refused for HTTP app keys and remote apps). A one-off choice is log_work kind=decision; a lesson is kind=learning. Requires project. Returns method rows.
| Argument | Type | Description |
|---|---|---|
| name | string | create: name, unique in the project (required). update: a new name. |
| model | string | Model name if known. Never guess. |
| steps | array | create / update: ordered steps. update replaces the whole list. |
| action* | string | The operation; see the tool description. |
| project* | string | integer | Project name or id. Required. |
| category | string | create / update: the group. list: filter. |
| method_id | integer | update / delete: the method's id (required). |
| description | string | create (required) / update: what the procedure is. |
| code_example | string | create / update: sample code. No secrets. |
| related_component_id | integer | create / update: the component it belongs to. |
{
"type": "object",
"required": [
"action",
"project"
],
"properties": {
"name": {
"type": "string",
"description": "create: name, unique in the project (required). update: a new name."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"steps": {
"type": "array",
"items": {
"type": "string"
},
"description": "create / update: ordered steps. update replaces the whole list."
},
"action": {
"enum": [
"list",
"create",
"update",
"delete"
],
"type": "string",
"description": "The operation; see the tool description."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required."
},
"category": {
"enum": [
"auth",
"deployment",
"testing",
"architecture",
"workflow",
"convention",
"api",
"security",
"other"
],
"type": "string",
"description": "create / update: the group. list: filter."
},
"method_id": {
"type": "integer",
"description": "update / delete: the method's id (required)."
},
"description": {
"type": "string",
"description": "create (required) / update: what the procedure is."
},
"code_example": {
"type": "string",
"description": "create / update: sample code. No secrets."
},
"related_component_id": {
"type": "integer",
"description": "create / update: the component it belongs to."
}
}
}Work on a project's existing problems (bugs, blockers). list: open problems. tree: one problem with every attempt and its solution. add_attempt: record a try. end_attempt: how a try ended. solve: close it with what fixed it (manage_history undo reopens it). Open a new problem with log_work kind=problem. Reads: list, tree. Writes need project. Returns problem rows, the tree, or the saved attempt or solution.
| Argument | Type | Description |
|---|---|---|
| model | string | Model name if known. Never guess. |
| notes | string | end_attempt: what you learned. |
| action* | string | The operation; see the tool description. |
| compact | boolean | list: shorter rows. |
| outcome | string | end_attempt: how it ended (required). |
| project | string | integer | Project name or id. Required for writes; list: omit for all projects. |
| summary | string | solve: what fixed it (required). |
| attempt_id | integer | end_attempt: the attempt's id (from add_attempt or tree). |
| confidence | string | end_attempt: how sure. Default attempted. |
| problem_id | integer | tree / add_attempt / solve: the problem's id. |
| description | string | add_attempt: what you tried (required). |
| key_insight | string | solve: the lesson, one sentence. |
| code_snippet | string | solve: the fix as text. No secrets. |
| component_id | integer | list: only this component's problems. |
| parent_attempt_id | integer | add_attempt: an earlier attempt this one builds on. |
| winning_attempt_id | integer | solve: the attempt that worked. |
{
"type": "object",
"required": [
"action"
],
"properties": {
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"notes": {
"type": "string",
"description": "end_attempt: what you learned."
},
"action": {
"enum": [
"list",
"tree",
"add_attempt",
"end_attempt",
"solve"
],
"type": "string",
"description": "The operation; see the tool description."
},
"compact": {
"type": "boolean",
"description": "list: shorter rows."
},
"outcome": {
"enum": [
"success",
"failure",
"partial",
"abandoned"
],
"type": "string",
"description": "end_attempt: how it ended (required)."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required for writes; list: omit for all projects."
},
"summary": {
"type": "string",
"description": "solve: what fixed it (required)."
},
"attempt_id": {
"type": "integer",
"description": "end_attempt: the attempt's id (from add_attempt or tree)."
},
"confidence": {
"enum": [
"attempted",
"worked_once",
"verified",
"proven",
"deprecated"
],
"type": "string",
"description": "end_attempt: how sure. Default attempted."
},
"problem_id": {
"type": "integer",
"description": "tree / add_attempt / solve: the problem's id."
},
"description": {
"type": "string",
"description": "add_attempt: what you tried (required)."
},
"key_insight": {
"type": "string",
"description": "solve: the lesson, one sentence."
},
"code_snippet": {
"type": "string",
"description": "solve: the fix as text. No secrets."
},
"component_id": {
"type": "integer",
"description": "list: only this component's problems."
},
"parent_attempt_id": {
"type": "integer",
"description": "add_attempt: an earlier attempt this one builds on."
},
"winning_attempt_id": {
"type": "integer",
"description": "solve: the attempt that worked."
}
}
}Projects and their components (named parts of a project). list: projects (by status). create: only when the user asks; names are unique. update: rename, describe, or set status (archived retires it). list_components / add_component / update_component: the same for components (deprecated retires one). delete / delete_component: only when the user asks. Deletes it with its child records after a safety copy; the answer gives the undo call. If the user turned approvals on it waits for their own approve instead (manage_review lists it; tell them the answer's next line). Reads: list, list_components. Returns project or component rows, or what was deleted.
| Argument | Type | Description |
|---|---|---|
| name | string | create / add_component: the new name (required, unique). update / update_component: a new name. |
| model | string | Model name if known. Never guess. |
| action* | string | The operation; see the tool description. |
| status | string | list: only this status. update: active, paused, completed or archived. update_component: planning, in_progress, testing, complete or deprecated. |
| project | string | integer | Every action but list and create: the project, by name or id. |
| description | string | create / update / add_component / update_component: what it is. |
| component_id | integer | update_component / delete_component: the component's id (list_components shows ids). |
| parent_component_id | integer | add_component: a parent component in the same project. |
{
"type": "object",
"required": [
"action"
],
"properties": {
"name": {
"type": "string",
"description": "create / add_component: the new name (required, unique). update / update_component: a new name."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"action": {
"enum": [
"list",
"list_components",
"create",
"add_component",
"update",
"update_component",
"delete",
"delete_component"
],
"type": "string",
"description": "The operation; see the tool description."
},
"status": {
"enum": [
"active",
"paused",
"completed",
"archived",
"planning",
"in_progress",
"testing",
"complete",
"deprecated"
],
"type": "string",
"description": "list: only this status. update: active, paused, completed or archived. update_component: planning, in_progress, testing, complete or deprecated."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Every action but list and create: the project, by name or id."
},
"description": {
"type": "string",
"description": "create / update / add_component / update_component: what it is."
},
"component_id": {
"type": "integer",
"description": "update_component / delete_component: the component's id (list_components shows ids)."
},
"parent_component_id": {
"type": "integer",
"description": "add_component: a parent component in the same project."
}
}
}The user's review queue and mode: summaries, suggestions, imports, clean-ups, deletes, conflicts. list (a line each; item_id: one in full), get_mode: read-only. walk: when the user asks what's waiting (boxes or links). approve: make it a record (edit / move_to first), delete (confirm_name), confirm a conflict (keep=a|b|both). set_mode: which new records wait. approve, reject, set_mode: ONLY call this when the user has explicitly told you, in this chat; quote them in user_request; never approve your own suggestions or change the mode to get your own writes saved. Hosted: approve/reject are refused for every AI; share the review page link. Returns {items, total}, the mode, or the result.
| Argument | Type | Description |
|---|---|---|
| keep | string | Disagreement: a (older), b (newer) or both. |
| mode | string | set_mode: the new mode (default auto_only). |
| after | integer | list, walk: the page after this id. |
| clear | boolean | set_mode: drop this project's override. |
| kinds | array | set_mode, mode=types: kinds that wait. |
| limit | integer | list: how many (20; max 100). |
| model | string | Model name if known. Never guess. |
| action* | string | The operation; see the tool description. |
| reason | string | reject: the user's reason (required). |
| status | string | list: which ones. Default pending. |
| details | string | approve: new details. |
| item_id | integer | list: one in full. approve / reject: its id. |
| move_to | string | integer | Project to move a misfiled item to. |
| project | string | integer | Required to approve or reject. |
| summary | string | approve: new summary. |
| category | string | approve: for a learning. |
| priority | string | approve: for a todo or problem. |
| component | string | approve: component to file it under. |
| confirm_name | string | Project delete: the exact name. |
| user_request | string | The user's own words (required). |
{
"type": "object",
"required": [
"action"
],
"properties": {
"keep": {
"enum": [
"a",
"b",
"both"
],
"type": "string",
"description": "Disagreement: a (older), b (newer) or both."
},
"mode": {
"enum": [
"off",
"auto_only",
"types",
"everything"
],
"type": "string",
"description": "set_mode: the new mode (default auto_only)."
},
"after": {
"type": "integer",
"description": "list, walk: the page after this id."
},
"clear": {
"type": "boolean",
"description": "set_mode: drop this project's override."
},
"kinds": {
"type": "array",
"items": {
"enum": [
"decision",
"change",
"problem",
"learning",
"todo"
],
"type": "string"
},
"description": "set_mode, mode=types: kinds that wait."
},
"limit": {
"type": "integer",
"description": "list: how many (20; max 100)."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"action": {
"enum": [
"list",
"walk",
"get_mode",
"approve",
"reject",
"set_mode"
],
"type": "string",
"description": "The operation; see the tool description."
},
"reason": {
"type": "string",
"description": "reject: the user's reason (required)."
},
"status": {
"enum": [
"pending",
"approved",
"rejected",
"all"
],
"type": "string",
"description": "list: which ones. Default pending."
},
"details": {
"type": "string",
"description": "approve: new details."
},
"item_id": {
"type": "integer",
"description": "list: one in full. approve / reject: its id."
},
"move_to": {
"type": [
"string",
"integer"
],
"description": "Project to move a misfiled item to."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Required to approve or reject."
},
"summary": {
"type": "string",
"description": "approve: new summary."
},
"category": {
"enum": [
"pattern",
"gotcha",
"best_practice",
"tool_tip",
"architecture",
"performance",
"security",
"other"
],
"type": "string",
"description": "approve: for a learning."
},
"priority": {
"enum": [
"critical",
"urgent",
"high",
"normal",
"medium",
"low"
],
"type": "string",
"description": "approve: for a todo or problem."
},
"component": {
"type": "string",
"description": "approve: component to file it under."
},
"confirm_name": {
"type": "string",
"description": "Project delete: the exact name."
},
"user_request": {
"type": "string",
"description": "The user's own words (required)."
}
}
}A project's hard rules: short never/always rules from the user, shown first in every brief and never cut. add: when the user states one (one sentence, max 300 chars; 25 rules, 2,000 chars in total); it waits in the review queue until the user approves it themselves (on their review page; no app can). list: active rules. remove: ONLY when the user asks in this chat; quote them in user_request; it waits like add; the rule is kept as removed. Preferences and lessons go in log_work. Requires project. Returns the rule or {rules}.
| Argument | Type | Description |
|---|---|---|
| rule | string | add: the rule, one short sentence. |
| model | string | Model name if known. Never guess. |
| action* | string | The operation; see the tool description. |
| project* | string | integer | Project name or id. Required. |
| rule_id | integer | remove: the rule's id (R<id> in the brief). |
| user_request | string | remove (required): the user's own words asking to remove it. |
| include_removed | boolean | list: also removed rules. |
{
"type": "object",
"required": [
"action",
"project"
],
"properties": {
"rule": {
"type": "string",
"description": "add: the rule, one short sentence."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"action": {
"enum": [
"add",
"list",
"remove"
],
"type": "string",
"description": "The operation; see the tool description."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required."
},
"rule_id": {
"type": "integer",
"description": "remove: the rule's id (R<id> in the brief)."
},
"user_request": {
"type": "string",
"description": "remove (required): the user's own words asking to remove it."
},
"include_removed": {
"type": "boolean",
"description": "list: also removed rules."
}
}
}Inspect FlowState's sessions. They open and close by themselves (closed after 2 hours idle or when the app quits, with a summary queued for review), so this is rarely needed. current, list, conversations: read. start: returns the automatic session. end: close one with a summary (not undoable). Decisions go in log_work. Returns session or conversation rows.
| Argument | Type | Description |
|---|---|---|
| limit | integer | list / conversations: max rows. Default 20. |
| model | string | Model name if known. Never guess. |
| action* | string | The operation; see the tool description. |
| project | string | integer | Project name or id. Required except for current. |
| summary | string | end: what was accomplished. |
| outcomes | array | end: short outcome lines. |
| session_id | integer | end: the session's id (required). conversations: only this session. |
| focus_problem_id | integer | start: problem in focus (ignored if a session is open). |
| focus_component_id | integer | start: component in focus (ignored if a session is open). |
{
"type": "object",
"required": [
"action"
],
"properties": {
"limit": {
"type": "integer",
"description": "list / conversations: max rows. Default 20."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"action": {
"enum": [
"current",
"list",
"conversations",
"start",
"end"
],
"type": "string",
"description": "The operation; see the tool description."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required except for current."
},
"summary": {
"type": "string",
"description": "end: what was accomplished."
},
"outcomes": {
"type": "array",
"items": {
"type": "string"
},
"description": "end: short outcome lines."
},
"session_id": {
"type": "integer",
"description": "end: the session's id (required). conversations: only this session."
},
"focus_problem_id": {
"type": "integer",
"description": "start: problem in focus (ignored if a session is open)."
},
"focus_component_id": {
"type": "integer",
"description": "start: component in focus (ignored if a session is open)."
}
}
}The connected app's own learned skills, checkpoints and metrics: how the AI works, not project facts (those go in log_work). learn: save a skill. list: a project's and global skills. confirm: one more session where it held (promoted after 3 at a 0.8 rate). save_state / get_state: a checkpoint. log_metric / list_metrics: scores. Reads: list, get_state, list_metrics; the rest only add rows or counts. Returns rows.
| Argument | Type | Description |
|---|---|---|
| model | string | Model name if known. Never guess. |
| skill | string | learn: what was learned (required). |
| action* | string | The operation; see the tool description. |
| context | string | learn: when it applies. log_metric: where it was scored. |
| outcome | string | log_metric: what happened. |
| project | string | integer | Project name or id. Required except for list and list_metrics; list adds global skills. |
| skill_id | integer | confirm: the skill's id (required). |
| key_facts | array | save_state: facts to keep. |
| tool_name | string | learn: the related tool. list: filter. |
| skill_type | string | learn (required) / list (filter): the kind of skill. |
| metric_type | string | log_metric (required) / list_metrics (filter): which metric. |
| action_taken | string | log_metric: what was done. |
| focus_summary | string | save_state: what the session was doing. |
| promoted_only | boolean | list: only promoted skills. |
| pending_decisions | array | save_state: decisions not made yet. |
| active_problem_ids | array | save_state: problem ids in progress. |
| effectiveness_score | number | log_metric: score from 0.0 to 1.0. |
| active_component_ids | array | save_state: component ids in progress. |
{
"type": "object",
"required": [
"action"
],
"properties": {
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"skill": {
"type": "string",
"description": "learn: what was learned (required)."
},
"action": {
"enum": [
"list",
"get_state",
"list_metrics",
"learn",
"confirm",
"save_state",
"log_metric"
],
"type": "string",
"description": "The operation; see the tool description."
},
"context": {
"type": "string",
"description": "learn: when it applies. log_metric: where it was scored."
},
"outcome": {
"type": "string",
"description": "log_metric: what happened."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required except for list and list_metrics; list adds global skills."
},
"skill_id": {
"type": "integer",
"description": "confirm: the skill's id (required)."
},
"key_facts": {
"type": "array",
"items": {
"type": "string"
},
"description": "save_state: facts to keep."
},
"tool_name": {
"type": "string",
"description": "learn: the related tool. list: filter."
},
"skill_type": {
"enum": [
"tool_capability",
"user_preference",
"approach",
"gotcha",
"project_specific"
],
"type": "string",
"description": "learn (required) / list (filter): the kind of skill."
},
"metric_type": {
"enum": [
"checkpoint_timing",
"tool_choice",
"response_quality",
"prediction_accuracy",
"user_satisfaction"
],
"type": "string",
"description": "log_metric (required) / list_metrics (filter): which metric."
},
"action_taken": {
"type": "string",
"description": "log_metric: what was done."
},
"focus_summary": {
"type": "string",
"description": "save_state: what the session was doing."
},
"promoted_only": {
"type": "boolean",
"description": "list: only promoted skills."
},
"pending_decisions": {
"type": "array",
"items": {
"type": "string"
},
"description": "save_state: decisions not made yet."
},
"active_problem_ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "save_state: problem ids in progress."
},
"effectiveness_score": {
"type": "number",
"description": "log_metric: score from 0.0 to 1.0."
},
"active_component_ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "save_state: component ids in progress."
}
}
}Todos. list; next: top unblocked (others' claims last). update: status (done/cancelled), priority, title, description. block / unblock: waits on todos or a problem. add: subtask, blocker or due date only (else log_work). claim before you start (fails if someone has it); renew; release or handoff (with a note). Returns rows.
| Argument | Type | Description |
|---|---|---|
| sort | string | list: default priority. |
| limit | integer | next: how many (default 5). |
| model | string | Model name if known. Never guess. |
| title | string | add (required) / update. |
| action* | string | The operation; see the tool description. |
| status | string | update: new. list: filter. |
| compact | boolean | list: shorter rows. |
| minutes | integer | claim / renew: 1-120, default 15. |
| project* | string | integer | Project name or id. Required. |
| todo_id | integer | #id in the brief. |
| due_date | string | add: ISO due date. |
| priority | string | add / update. list: filter. |
| next_step | string | handoff: the next step. |
| blocked_by | array | Todo ids it waits on. |
| description | string | add / update. |
| where_i_was | string | handoff: your progress. |
| component_id | integer | add: component id. |
| min_priority | string | list: this or more urgent. |
| parent_todo_id | integer | add: parent todo id. |
| blocked_by_problem | integer | Problem id it waits on. |
{
"type": "object",
"required": [
"action",
"project"
],
"properties": {
"sort": {
"enum": [
"priority",
"due",
"newest"
],
"type": "string",
"description": "list: default priority."
},
"limit": {
"type": "integer",
"description": "next: how many (default 5)."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"title": {
"type": "string",
"description": "add (required) / update."
},
"action": {
"enum": [
"list",
"next",
"update",
"block",
"unblock",
"add",
"claim",
"renew",
"release",
"handoff"
],
"type": "string",
"description": "The operation; see the tool description."
},
"status": {
"enum": [
"pending",
"in_progress",
"blocked",
"done",
"cancelled"
],
"type": "string",
"description": "update: new. list: filter."
},
"compact": {
"type": "boolean",
"description": "list: shorter rows."
},
"minutes": {
"type": "integer",
"description": "claim / renew: 1-120, default 15."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required."
},
"todo_id": {
"type": "integer",
"description": "#id in the brief."
},
"due_date": {
"type": "string",
"description": "add: ISO due date."
},
"priority": {
"enum": [
"critical",
"urgent",
"high",
"normal",
"medium",
"low"
],
"type": "string",
"description": "add / update. list: filter."
},
"next_step": {
"type": "string",
"description": "handoff: the next step."
},
"blocked_by": {
"type": "array",
"items": {
"type": "integer"
},
"description": "Todo ids it waits on."
},
"description": {
"type": "string",
"description": "add / update."
},
"where_i_was": {
"type": "string",
"description": "handoff: your progress."
},
"component_id": {
"type": "integer",
"description": "add: component id."
},
"min_priority": {
"enum": [
"critical",
"urgent",
"high",
"normal",
"medium",
"low"
],
"type": "string",
"description": "list: this or more urgent."
},
"parent_todo_id": {
"type": "integer",
"description": "add: parent todo id."
},
"blocked_by_problem": {
"type": "integer",
"description": "Problem id it waits on."
}
}
}Non-secret project settings: hosts, ports, endpoints, config. create, list (read), update (undo with manage_history), delete (undo restores it; with approvals on it waits for the user; refused for HTTP app keys and remote apps). Secrets are refused; is_secret only labels a value and does not hide it, so never store passwords, tokens or keys. Requires project. Returns variable rows.
| Argument | Type | Description |
|---|---|---|
| name | string | create: name, unique per project and category (required). update: a new name. |
| model | string | Model name if known. Never guess. |
| value | string | create / update: the setting as text. Never a secret. |
| action* | string | The operation; see the tool description. |
| project* | string | integer | Project name or id. Required. |
| category | string | create / update: the group, default custom. list: filter. |
| is_secret | boolean | create / update: label as sensitive. It is still returned by list. |
| description | string | create / update: what it is for. |
| variable_id | integer | update / delete: the variable's id (required). |
{
"type": "object",
"required": [
"action",
"project"
],
"properties": {
"name": {
"type": "string",
"description": "create: name, unique per project and category (required). update: a new name."
},
"model": {
"type": "string",
"description": "Model name if known. Never guess."
},
"value": {
"type": "string",
"description": "create / update: the setting as text. Never a secret."
},
"action": {
"enum": [
"list",
"create",
"update",
"delete"
],
"type": "string",
"description": "The operation; see the tool description."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Project name or id. Required."
},
"category": {
"enum": [
"server",
"credentials",
"config",
"environment",
"endpoint",
"custom"
],
"type": "string",
"description": "create / update: the group, default custom. list: filter."
},
"is_secret": {
"type": "boolean",
"description": "create / update: label as sensitive. It is still returned by list."
},
"description": {
"type": "string",
"description": "create / update: what it is for."
},
"variable_id": {
"type": "integer",
"description": "update / delete: the variable's id (required)."
}
}
}Find stored todos, decisions, changes, learnings, problems and solutions. query: ranked matches. query + answer=true: a short quoted answer with record ids, or says FlowState has nothing. query="D12": decision 12 in full. No query: the newest records. Read-only. Overview: start_here. Returns {results, count} or {answer, sources}.
| Argument | Type | Description |
|---|---|---|
| mode | string | auto, keyword or meaning. |
| limit | integer | Default 10, max 50. |
| query | string | Words, or a question when answer=true. Omit to list newest. |
| answer | boolean | true = answer the query, quoting records. |
| project | string | integer | Omit to search every project. |
| since_hours | integer | No query only: from the last N hours. |
| content_types | array | Only these record types. Omit for all. |
| include_set_aside | boolean | true = also records set aside (manage_memory set_aside). |
{
"type": "object",
"properties": {
"mode": {
"enum": [
"auto",
"keyword",
"meaning"
],
"type": "string",
"default": "auto",
"description": "auto, keyword or meaning."
},
"limit": {
"type": "integer",
"description": "Default 10, max 50."
},
"query": {
"type": "string",
"description": "Words, or a question when answer=true. Omit to list newest."
},
"answer": {
"type": "boolean",
"description": "true = answer the query, quoting records."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Omit to search every project."
},
"since_hours": {
"type": "integer",
"description": "No query only: from the last N hours."
},
"content_types": {
"type": "array",
"items": {
"enum": [
"todo",
"decision",
"change",
"learning",
"problem",
"solution"
],
"type": "string"
},
"description": "Only these record types. Omit for all."
},
"include_set_aside": {
"type": "boolean",
"description": "true = also records set aside (manage_memory set_aside)."
}
}
}CALL THIS FIRST in every conversation about a project. Returns the brief as text: hard rules, a handoff note if any, review mode, possible conflicts, open todos (and claims) and problems, recent changes, decisions and learnings. No project: lists projects. Side effects: opens or reuses the automatic session, notes when you looked.
| Argument | Type | Description |
|---|---|---|
| size | string | quick, standard (default) or deep. |
| folder | string | Working folder, if no project is given. |
| project | string | integer | Name or id. Omit to list projects. |
{
"type": "object",
"properties": {
"size": {
"enum": [
"quick",
"standard",
"deep"
],
"type": "string",
"default": "standard",
"description": "quick, standard (default) or deep."
},
"folder": {
"type": "string",
"description": "Working folder, if no project is given."
},
"project": {
"type": [
"string",
"integer"
],
"description": "Name or id. Omit to list projects."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 7, 2026.