Connect Claude directly to VAAS-X.
No SDK install required.

vaasxmcp is a remote MCP server -- persistent, outcome-grounded episodic memory for Claude and any other MCP client. Add it as a connector and Claude can recall relevant past episodes at the start of a task, and write new ones as it works, without you asking it to.

https://mcp.vaasx.com/mcp

Listed on the Official MCP Registry as io.github.VAAS-X/vaasxmcp.

Why This Is Different From a Vector-Search Connector

Most agent memory is either a context window that resets every session, or a vector database that only ever tells you what's semantically similar. vaasxmcp is neither: it stores what happened as state → action → outcome episodes, so retrieval surfaces what actually worked, not just what looks close.

ADD THE CONNECTOR

2. Add It to Claude

In Claude.ai: Settings → Connectors → Add custom connector. Paste https://mcp.vaasx.com/mcp, then authorize via OAuth -- enter the API key from step 1 when prompted to link the connector to your VAAS-X account.

USE IT

3. Just Work

Once connected, Claude can recall relevant past episodes at the start of a task and write new ones as it works, without you asking it to.

Tools

recall

Search past episodes, ranked toward what actually worked. Arguments: query (required), k (default 5), include_failures (default false), device_id (default: account default).

remember

Record a distilled fact or decision. Arguments: text (required), outcome ("success" / "failure" / "neutral", default neutral, or "pending" to leave it unresolved -- see below), tags, context, device_id.

record_outcome

Close the loop on a memory once its outcome becomes known -- e.g. a tentative fix later confirmed working. Arguments: episode_id (required), result (required), delta, resolved, device_id, expected_prior_result (optional compare-and-swap guard -- see below).

get_memory

Direct lookup of one episode by id -- an exact fetch, not a search. Arguments: episode_id (required), device_id.

await_pending

Long-poll for pending work on a device -- blocks until an episode with an unresolved outcome appears, or the timeout elapses, whichever comes first. Call it in a loop from an otherwise-idle session to turn it into a live worker: act on whatever comes back, then close it with record_outcome. Arguments: device_id, timeout_s (default 25, capped), poll_interval_s (default 3), query, k (default 25).

A Job Queue, Not Just a Memory Store

Every episode has an outcome.result -- most of the time you already know it. Leave it unresolved instead and the same three tools become a queue: enqueue with remember, dispatch with await_pending, complete with record_outcome -- and completion is compare-and-swap, so two workers racing for the same item can't silently clobber each other.

1. ENQUEUE

Leave it unresolved

remember(text, outcome="pending") writes the episode with outcome.result: "pending" instead of a known result -- work for someone (or something) else to pick up.

2. DISPATCH

Long-poll for it

An otherwise-idle session calls await_pending() in a loop. As soon as a pending episode lands on that device, the call returns it instead of waiting out the full timeout.

3. COMPLETE

Close it, exactly once

record_outcome(episode_id, result, expected_prior_result="pending") only applies if the episode is still pending. If another session already closed it, this fails with 409 outcome_conflict and the real current value -- instead of silently overwriting it.

Live-verified, not just documented: closing an already-closed episode with the same guard returns {"error": true, "status_code": 409, "detail": {"error": "outcome_conflict", "expected_prior_result": "pending", "actual_result": "..."}} -- the real conflicting value, not a silent overwrite.

Why Outcome-Grounded, Not Just Similarity Search

A plain vector search returns the nearest match. recall() defaults to success-weighted ranking, so a past episode you later marked as a failure doesn't outrank one that worked, even if it's a closer textual match -- the whole point when the recall is feeding a decision, not just a citation.

How Memory Stores Work

Each connected account gets a default memory store on first use. Pass a different device_id to any tool to keep separate stores -- per project, per client, per agent -- all under the same account. Enterprise-tier accounts can federate reads across multiple stores.

Validated Performance

Backed by the same retrieval substrate behind the vaas-x SDK: 14ms mean retrieval across 1.18M-item benchmark, standard CPU instance, no GPU. 100% blind classification on NASA's CMAPSS FD001.

Questions

Get a free-tier key and connect in under a minute, or reach out with questions about Enterprise multi-store federation.

Email: hello@vaasx.com

Docs: vaasx.com/docs

SDK: github.com/VAAS-X/vaas-x