Long-term, rotatable project memory and pre-write checks for AI coding agents.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer rcsk_ workspace key from Ricursor Connections
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.
Metadata-only decision for a JS/TS write or delete. Returns allow or block (with reasons to fix) plus a one-use receipt. Never send source.
Unique per proposed action, 8-80 characters.
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 ricursor https://api.ricursor.com/v1/mcp \ --header 'Authorization: Bearer YOUR_TOKEN'
Headers
Authorization (required): Bearer rcsk_ workspace key from Ricursor ConnectionsMetadata-only decision for a JS/TS write or delete. Returns allow or block (with reasons to fix) plus a one-use receipt. Never send source.
| Argument | Type | Description |
|---|---|---|
| kind* | string | |
| path* | string | |
| project* | string | |
| metadata | object | |
| action_id* | string | Unique per proposed action, 8-80 characters. |
| result_hash | string | |
| dependencies | array | |
| baseline_hash* | any | |
| expected_version | integer |
{
"type": "object",
"required": [
"kind",
"project",
"action_id",
"path",
"baseline_hash"
],
"properties": {
"kind": {
"enum": [
"write",
"delete"
],
"type": "string"
},
"path": {
"type": "string"
},
"project": {
"type": "string"
},
"metadata": {
"type": "object"
},
"action_id": {
"type": "string",
"description": "Unique per proposed action, 8-80 characters."
},
"result_hash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"dependencies": {
"type": "array"
},
"baseline_hash": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
{
"type": "null"
}
]
},
"expected_version": {
"type": "integer",
"minimum": 0
}
}
}Atomically consumes a receipt immediately before the broker executes. Fails if anything changed.
| Argument | Type | Description |
|---|---|---|
| receipt* | string | |
| action_id* | string | Unique per proposed action, 8-80 characters. |
| result_hash* | any | |
| baseline_hash* | any |
{
"type": "object",
"required": [
"action_id",
"receipt",
"baseline_hash",
"result_hash"
],
"properties": {
"receipt": {
"type": "string"
},
"action_id": {
"type": "string",
"description": "Unique per proposed action, 8-80 characters."
},
"result_hash": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
{
"type": "null"
}
]
},
"baseline_hash": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
{
"type": "null"
}
]
}
},
"additionalProperties": false
}Metadata-only decision for up to 20 related JS/TS writes/deletes judged on their combined end state (moves, renames).
| Argument | Type | Description |
|---|---|---|
| actions* | array | |
| project* | string | |
| group_id* | string | Unique per proposed action, 8-80 characters. |
{
"type": "object",
"required": [
"project",
"group_id",
"actions"
],
"properties": {
"actions": {
"type": "array",
"items": {
"type": "object"
},
"maxItems": 20,
"minItems": 1
},
"project": {
"type": "string"
},
"group_id": {
"type": "string",
"description": "Unique per proposed action, 8-80 characters."
}
}
}All-or-nothing consumption before the broker writes the group.
| Argument | Type | Description |
|---|---|---|
| receipt* | string | |
| group_id* | string | Unique per proposed action, 8-80 characters. |
{
"type": "object",
"required": [
"group_id",
"receipt"
],
"properties": {
"receipt": {
"type": "string"
},
"group_id": {
"type": "string",
"description": "Unique per proposed action, 8-80 characters."
}
},
"additionalProperties": false
}Stop on block or errors. Checks tracked versions, exports and accepted import boundaries; never writes code.
| Argument | Type | Description |
|---|---|---|
| hash* | string | |
| path* | string | |
| project* | string | Project name inside the workspace. |
| metadata* | object | |
| dependencies* | array | |
| expected_version* | integer |
{
"type": "object",
"required": [
"project",
"path",
"hash",
"metadata",
"expected_version",
"dependencies"
],
"properties": {
"hash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"path": {
"type": "string"
},
"project": {
"type": "string",
"description": "Project name inside the workspace."
},
"metadata": {
"type": "object",
"required": [
"exports",
"imports"
],
"properties": {
"exports": {
"type": "array",
"items": {
"type": "string"
}
},
"imports": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"names"
],
"properties": {
"names": {
"type": "array",
"items": {
"type": "string"
}
},
"source": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"dependencies": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"version"
],
"properties": {
"path": {
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
}
}
},
"maxItems": 100
},
"expected_version": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}The verified corrections and recent file changes an agent must respect before it writes code.
| Argument | Type | Description |
|---|---|---|
| task | string | Task to retrieve relevant rules for. |
| limit | integer | |
| since | string | Previous cursor for this same key, project and task; returns changed rules and removed IDs. |
| project | string | Project name inside the workspace. |
| workspace | string | Ignored: the key already selects its workspace. |
{
"type": "object",
"properties": {
"task": {
"type": "string",
"description": "Task to retrieve relevant rules for."
},
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1
},
"since": {
"type": "string",
"description": "Previous cursor for this same key, project and task; returns changed rules and removed IDs."
},
"project": {
"type": "string",
"description": "Project name inside the workspace."
},
"workspace": {
"type": "string",
"description": "Ignored: the key already selects its workspace."
}
}
}After Ricursor blocks a check, save the one-sentence lesson so every agent on this project gets it. Only accepted for your own blocked action from the last 24 hours.
| Argument | Type | Description |
|---|---|---|
| rule* | string | |
| project* | string | Project name inside the workspace. |
| action_id* | string | action_id or group_id of the blocked check. |
{
"type": "object",
"required": [
"project",
"action_id",
"rule"
],
"properties": {
"rule": {
"type": "string",
"maxLength": 500,
"minLength": 8
},
"project": {
"type": "string",
"description": "Project name inside the workspace."
},
"action_id": {
"type": "string",
"description": "action_id or group_id of the blocked check."
}
},
"additionalProperties": false
}Save structured task IDs and versioned rule decisions; never include prompts or source.
| Argument | Type | Description |
|---|---|---|
| state* | object | |
| project* | string | Project name inside the workspace. |
| task_id* | string | |
| expected_version* | integer |
{
"type": "object",
"required": [
"project",
"task_id",
"expected_version",
"state"
],
"properties": {
"state": {
"type": "object",
"required": [
"completed",
"pending",
"decisions"
],
"properties": {
"pending": {
"type": "array",
"items": {
"type": "string"
}
},
"completed": {
"type": "array",
"items": {
"type": "string"
}
},
"decisions": {
"type": "array",
"items": {
"type": "object",
"required": [
"constraint_id",
"version",
"status"
],
"properties": {
"status": {
"enum": [
"accepted",
"conflict"
],
"type": "string"
},
"version": {
"type": "integer",
"minimum": 1
},
"constraint_id": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
"project": {
"type": "string",
"description": "Project name inside the workspace."
},
"task_id": {
"type": "string"
},
"expected_version": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
}Read scoped metadata and rule versions before switching models. Observe only.
| Argument | Type | Description |
|---|---|---|
| project* | string | Project name inside the workspace. |
{
"type": "object",
"required": [
"project"
],
"properties": {
"project": {
"type": "string",
"description": "Project name inside the workspace."
}
},
"additionalProperties": false
}Record what an agent spent (usage) and what it changed (state).
| Argument | Type | Description |
|---|---|---|
| state | object | |
| usage | object | |
| project | string | Project name inside the workspace. |
| workspace | string | Ignored: the key already selects its workspace. |
| request_id* | string | Unique ID per logical report; reuse unchanged when retrying. |
{
"type": "object",
"required": [
"request_id"
],
"properties": {
"state": {
"type": "object",
"required": [
"kind",
"path",
"detail"
],
"properties": {
"kind": {
"enum": [
"file_change",
"delta",
"alert"
],
"type": "string"
},
"path": {
"type": "string"
},
"detail": {
"enum": [
"file_added",
"file_updated",
"file_deleted",
"exports_changed",
"imports_changed",
"stale_baseline",
"policy_conflict"
],
"type": "string"
}
}
},
"usage": {
"type": "object",
"required": [
"model",
"day",
"baseline_tokens",
"served_tokens"
],
"properties": {
"day": {
"type": "string",
"description": "YYYY-MM-DD"
},
"model": {
"type": "string"
},
"served_tokens": {
"type": "integer"
},
"baseline_tokens": {
"type": "integer"
}
}
},
"project": {
"type": "string",
"description": "Project name inside the workspace."
},
"workspace": {
"type": "string",
"description": "Ignored: the key already selects its workspace."
},
"request_id": {
"type": "string",
"description": "Unique ID per logical report; reuse unchanged when retrying."
}
}
}Sync locally extracted JS/TS structural metadata only; never transmit source.
| Argument | Type | Description |
|---|---|---|
| files* | array | |
| project* | string | Project name inside the workspace. |
{
"type": "object",
"required": [
"project",
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"hash",
"metadata",
"expected_version"
],
"properties": {
"hash": {
"anyOf": [
{
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
{
"type": "null"
}
]
},
"path": {
"type": "string"
},
"metadata": {
"anyOf": [
{
"type": "object",
"required": [
"exports",
"imports"
],
"properties": {
"exports": {
"type": "array",
"items": {
"type": "string"
}
},
"imports": {
"type": "array",
"items": {
"type": "object",
"required": [
"source",
"names"
],
"properties": {
"names": {
"type": "array",
"items": {
"type": "string"
}
},
"source": {
"type": "string"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
},
{
"type": "null"
}
]
},
"expected_version": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
},
"maxItems": 20,
"minItems": 1
},
"project": {
"type": "string",
"description": "Project name inside the workspace."
}
},
"additionalProperties": false
}The workspace this key can reach.
No arguments.
{
"type": "object",
"properties": {}
}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 15, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.