
MCP Tenant Pair
io.studiomeyerPublished by studiomeyer.iov0.1.3Updated Nov 3, 2026
Multi-user tenancy library for MCP servers. Pairs, groups, bi-temporal shared state, DSGVO erasure.
The publisher's own server: StudioMeyer Crew
Overview
MCP Tenant Pair's local MCP server, published by studiomeyer.io; no sign-in required; STDIO.
No AI overview yet: these facts come from the registry entry and the server itself.
- Publisher
- studiomeyer.io
Installation
In SourceWeft
- Open MCP Tenant Pair in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
Part of the StudioMeyer MCP Stack — Built in Mallorca 🌴 · ⭐ if you use it
mcp-tenant-pair
[npm version] [npm downloads] [License] [Last commit] [GitHub stars]
Foundation library + reference MCP server for multi-user tenancy in consumer MCP servers (couples, families, small groups). Identity-separated state, bi-temporal storage, conflict-resolver interface.Spec: MCP 2025-06-18 License: MIT Repo layout: monorepo (npm workspaces)
A note from us
We have been building tools and systems for ourselves for the past two years. The fact that this repo is small and has few stars is not because it is new. It is because we only just decided to share what we have built. It is not a fresh experiment, it is a long story with a recent commit.
We love building things and sharing them. We do not love social media tactics, growth hacks, or chasing stars and followers. So this repo is small. The code is real, it gets used, issues get answered. Judge for yourself.
If it helps you, sharing, testing, and feedback help us. If it could be better, an issue is more useful. If you build something with it, tell us at [email protected]. That genuinely makes our day.
From a small studio in Palma de Mallorca.
Why this exists
Most MCP servers today are single-user. The moment you want to share state across two or more humans (couples, families, small groups) you hit the same five sub-problems each time: pair creation, invite flow, identity-separated state, conflict resolution, voluntary leave / kick. This library solves them once, so downstream MCP servers (Pet-Platform, recipe-sharing, household, calendar) do not re-invent them.
5-Minute Quickstart
Library
CLI
Demo MCP server
Reads MCP_TENANT_PAIR_DB env (default :memory:).
Tools (12)
Compatibility Matrix
Storage adapters
- SqliteTenantStore — default, embedded, single-process. Uses
better-sqlite3with WAL mode. Pass{ path: "./pair.sqlite" }or:memory:. - PostgresTenantStore — multi-process, multi-tenant. Accepts any
pg.Pool-shaped client ({ query<R>(text, params): Promise<{rows: R[]}>, end?(): Promise<void> }).pgis a peer dependency.
Conflict resolution
ConflictResolver is an interface. Two implementations ship:
LWWResolver— picks the row with the latestvalidFrom, ties broken by highestversion. Throws on empty candidate list.ManualResolver— returns no resolutions; conflicts stay pending until a human resolves them externally.
Inject your own by implementing { name: string; resolve(conflicts: Conflict[]): Resolution[] }.
Bi-temporal model
Every overwrite of a (pairId, namespace, key) triple sets valid_to on the previous active row and inserts a new row with a fresh valid_from. version is monotonic per key. This lets you replay history (getPairStateHistory) and detect concurrent writes deterministically.
Identity separation
member_state is per-member (only readable by that member via get_member_constraints).
pair_state is shared (all active members can read via get_shared_state).
Writes by a member who later leaves or is kicked stay visible in shared state.
Security notes
- Invite tokens are
<uuid v4>.<XXXX-XXXX>— uuid v4 (122 bits CSPRNG entropy vianode:crypto) plus a voice-readable base32 short-code (default RNG isnode:crypto.randomInt, injectable for tests). - Per-pair pending-invite cap (default 25, configurable via
maxPendingInvites). - Owner-only kick. Owner cannot kick themselves; use leave instead.
- DSGVO Art. 17 erasure path:
forgetMember(pairId, memberId)hard-deletes the member'smember_staterows (allergies, dietary preferences) and nullsdisplay_name. Membership trace (left_at) is retained for audit. - Postgres adapter rejects schema names that don't match
/^[a-z_][a-z0-9_]{0,62}$/at construction time (defense against SQL injection via integrator-supplied schema strings). acceptInviteis race-safe — both adapters use atomic transactions (better-sqlite3 immediate transaction; pgBEGIN+SELECT ... FOR UPDATE).- Time is injectable (
now: () => Date) for deterministic tests.
Development
Tests cover (142 + 1 conditional):
- Pair creation (8)
- Invite flow (10)
- Invite expiry boundary (6) — accept/pending agree at the exact
expires_atinstant, both adapters - Member preferences (8)
- Shared state (8)
- Conflict resolution (13)
- Resolvers (11)
- Error handling (17) — exhaustive
TenantPairErrorcode coverage - Store adapters (6)
- Postgres adapter (26) — schema-identifier validation, atomic transaction, fallback paths (mock pool, no live DB)
- Adapter parity (6 + 1) — same operations against SQLite and Postgres produce identical results; the Postgres leg runs only when
TENANT_PAIR_TEST_PG_URL/DATABASE_URLpoints at a reachable database and is skipped otherwise (never false-fails) - Demo server integration (9)
- Round-1 regression fixes (14) — SQL-injection schema-validation, TOCTOU acceptInvite race, conflict-resolved winner-marker, asOf-clock, DSGVO erasure, CSPRNG-default
Run the cross-adapter parity suite against a real Postgres:
Status
Foundation build. Reviewed (Cold-Cross-Review + MCP Factory Reviewer + Tester) — all HIGH/MEDIUM findings fixed. tsc clean (strict), 142 tests green (+1 Postgres-conditional skip). Prod dependency tree carries 0 known advisories (npm audit --omit=dev).
About StudioMeyer
StudioMeyer is an AI and design studio based in Palma de Mallorca, working with clients worldwide. We build custom websites and AI infrastructure for small and medium businesses. Production stack on Claude Agent SDK, MCP and n8n, with Sentry, Langfuse and LangGraph for observability and an in-house guard layer.
Source: README.md at commit b6efcf0
Tools
0Version history
2- v0.1.3LatestNov 3, 2026
- v0.1.2Sep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts
Other Studiomeyer integrations
StudioMeyer Crew
io.studiomeyerOfficial publisher
Remote MCP server that adds agent personas, 16 tools and 3 workflows to Claude, with no extra API cost.
StudioMeyer Memory
io.studiomeyerOfficial publisher
Remote bi-temporal AI memory server with a knowledge graph and semantic search, giving an assistant persistent recall across sessions.

StudioMeyer MCP Suite
io.studiomeyerOfficial publisher
Remote MCP suite bundling eight servers and 104+ tools for memory, social, PDF, email, images, calendar, scheduling and files.
StudioMeyer GEO
io.studiomeyerOfficial publisher
A remote, EU-hosted MCP server that lets an assistant check how a brand or site appears across eight LLM platforms, with 30 tools, most needing no API key.
StudioMeyer CRM
io.studiomeyerOfficial publisher
StudioMeyer CRM is a remote, AI-native CRM server that gives an assistant 37 tools for pipeline, leads, health scores and GDPR rights.