baatjie-mcp-server
This server provides a unified MCP interface to the Baatjie Group's tanOS (property OS, sales pipeline, sequencing) and sigscheCore (signal scheduler) systems, offering 16 tools across generic CRUD, task management, operational reporting, signal scheduling, and safety features.
Schema & Data Access:
baatjie_describe_schemalists tables and columns.baatjie_queryreads with filtering, sorting, pagination, and optional PII.baatjie_insert,baatjie_update, andbaatjie_deletehandle writes with audit logging; destructive actions require confirmations or filters.Task Sequencing & Action Planning:
baatjie_create_todo,baatjie_list_todos,baatjie_update_todomanage todos with dependencies, waves, tracks, and effort.baatjie_next_actionsidentifies startable tasks ranked by unblocking power.Operations & Sales:
baatjie_dashboardgives a table count snapshot and BDOP clock phase.baatjie_pipelineshows per-BRM outreach/demos/sales vs. 26/day target.baatjie_log_activityrecords BRM actions.baatjie_arrearslists overdue active leases with notice counts.Signal Scheduling (sigscheCore):
baatjie_signal_queuelists posts by brand/status/date.baatjie_schedule_signalqueues posts, recognizing angel windows (08:17, 11:11, 13:13, 22:22).baatjie_brand_snapshotshows platform readiness and content library depth.Safety & Compliance: PII is redacted by default except where explicitly allowed; all writes are audited; deletions require confirmation; unfiltered updates/deletes are refused; table access is allowlisted (24 tables) and non-destructive tools carry read-only hints.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@baatjie-mcp-serverWhat should I do next on the property plan?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
baatjie-mcp-server
An MCP server exposing the two Baatjie Group systems through one interface:
tanOS — property OS, sales pipeline, and the dependency-aware action plan
sigscheCore — multi-brand signal scheduler across 33 platforms
Sixteen tools: five generic CRUD tools covering every allowlisted table, and eleven workflow tools for the paths used daily.
Install
npm install
npm run build
cp .env.example .env # then fill in both service role keysRelated MCP server: fallpharm-mcp
Run
# stdio (local MCP clients — Claude Desktop, Claude Code)
npm start
# streamable HTTP
TRANSPORT=http PORT=3000 npm startClaude Desktop / Claude Code config
{
"mcpServers": {
"baatjie": {
"command": "node",
"args": ["/absolute/path/to/baatjie-mcp-server/dist/index.js"],
"env": {
"TANOS_URL": "https://tlhzwovsgjptifhnzcvh.supabase.co",
"TANOS_SERVICE_KEY": "...",
"SIGSCHE_URL": "https://bikmrclrpgxenncqodti.supabase.co",
"SIGSCHE_SERVICE_KEY": "..."
}
}
}
}⚠️ Read this before pointing it at production
Service role keys are required, and this is not a preference. RLS is enabled on
every table in both projects with zero policies defined. A non-privileged key
therefore returns empty result sets rather than errors — the server would cheerfully
report 0 agencies signed, 0 tenants, 0 todos as though those were the facts.
This was observed during testing, not theorised.
baatjie_dashboard warns when every table reads zero, since all-zero across nineteen
tables is far more likely to be a credentials problem than a genuinely empty group.
Treat that warning as a hard stop.
The same fact has a second consequence worth stating plainly: because there are no RLS policies, the service role key is the only thing standing between this server and every row in both databases — tenant ID numbers, passport numbers and permit status, landlord banking details, and the policy book. Until RLS policies exist, guard the key accordingly and keep the server local rather than exposed over HTTP.
Design notes
Personal data is withheld by default. Reads of tenants, foreign_nationals,
landlords and agents drop direct identifiers (ID numbers, passport numbers, phone,
email, banking details) unless include_pii: true is passed, and the response reports
which fields were withheld. Routine queries shouldn't pull identity numbers into an
agent's context as a side effect.
Every write is audited. Inserts, updates and deletes write a row to tanOS
audit_log with the actor you supply. Pass a meaningful actor (baatjie,
marius-ai, deon-ai) rather than the default. If the audit write fails, the response
says so rather than pretending it succeeded.
Destructive operations are guarded. baatjie_delete requires confirm: true.
Unfiltered updates and deletes are refused outright rather than rewriting a whole table.
Tools carry MCP annotations (readOnlyHint, destructiveHint, idempotentHint) so
calling agents can reason about consequences.
Table access is allowlisted. The generic CRUD tools reach only the nineteen tanOS
and five sigscheCore tables named in constants.ts. They are not an arbitrary-schema
backdoor.
Tools
Generic — comprehensive coverage
Tool | Purpose |
| List reachable tables per project. Start here when unsure. |
| Read any table: filters, column selection, ordering, pagination |
| Insert rows into any table |
| Update rows matching a filter |
| Delete rows — requires |
Sequencing — the dependency graph
Tool | Purpose |
| What is genuinely startable now, ranked by downstream unblock count |
| Full board with wave, track, effort, blockers |
| Add an item, optionally sequenced |
| Change status/sequencing; reports what the change unblocked |
baatjie_next_actions is the one to reach for on "what should I do next". A flat todo
list hides the fact that most items are blocked; this answers the question the list is
standing in for.
Operations
Tool | Purpose |
| Counts across every table, sales position, BDOP clock and 33/22 sprint block |
| Sales rollup per BRM against the 26/day objective |
| Record a BRM's outreach/demos/sales for a sprint block |
| Active leases with no recent payment, ranked, with notices already sent |
sigscheCore
Tool | Purpose |
| Scheduled, sent and failed posts |
| Queue a post; sets the angel-window label automatically |
| Per-brand readiness across platforms |
Angel windows (08:17, 11:11, 13:13, 22:22) are recognised automatically when scheduling. Times outside them are accepted; the label is simply null.
A note on notices
notices rows and the baatjie_arrears report describe real occupants. baatjie_arrears
is deliberately read-only — it reports the position and does not send anything, because
serving a notice should be a separate deliberate act.
South African arrears and eviction notices carry statutory requirements under the Rental
Housing Act and the PIE Act, and proof-of-service technicalities are exactly where cases
fail. Route wording and timing through the legal-exposure-check skill before anything
reaches an occupant rather than after.
Development
npm run dev # watch mode
npm run build # compile to dist/
node test-harness.mjs # protocol + guardrail checks (needs env vars set)
npm run test:rls # RLS isolation regression (needs TANOS_ANON_KEY too, see below)test-harness.mjs verifies initialisation, tool registration, annotation coverage,
description quality, the delete confirmation guard, unfiltered-write refusal, Zod range
validation, and actionable error text. All 13 checks should pass.
tests/rls-regression.mjs automates the P0.1 isolation check that was previously run by
hand: seeds two agencies and two real Supabase Auth users, confirms an unauthenticated
(anon) read returns empty rather than erroring, confirms agency A can read its own row,
and confirms agency A's cross-agency read/update/delete/insert against agency B's row
are all blocked — then tears every fixture down in a finally block regardless of
outcome. Needs TANOS_ANON_KEY in addition to the usual service key, since the whole
point is to test as a non-privileged client rather than the key that bypasses RLS.
Scoped to the 10 tables that actually carry account_id + policies today (landlords,
properties, rooms, tenants, foreign_nationals, leases, lease_agreements, payments,
maintenance, notices) — a live get_advisors check on 2026-08-11 found ten other
tables (agents, ai_agents, audit_log, brms, daily_activity, employers, locare_accounts,
member_consents, policies, todos) still have RLS enabled with zero policies. That's
default-deny, not a live hole, but there's no per-agency scoping on those tables yet
for a test like this one to exercise.
evaluations.xml contains ten questions for testing whether an LLM can actually use
this server to answer realistic operational questions.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA production-grade MCP server designed for multi-tenant, authenticated, and observable AI agent systems, enabling secure tool execution across heterogeneous data sources.62MIT
- AlicenseNot gradedqualityCmaintenanceProvides a sovereign, MIT-licensed MCP server for professional-service workflows, running entirely on your infrastructure with Ed25519 cryptographic signing for every action.MIT
- AlicenseNot gradedqualityCmaintenanceA sovereign, MIT-licensed MCP server for professional-service workflow automation, enabling offline-capable, cryptographically signed operations without vendor lock-in.MIT
- FlicenseNot gradedqualityBmaintenanceA governed MCP server with OAuth 2.1 + PKCE, declarative tool scoping, row-level data filters, per-identity rate limits, and a tamper-evident audit trail.
Related MCP Connectors
Control plane for autonomous software labor. Agents claim objectives over MCP with audit trail.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
MCP server for generating rough-draft project plans from natural-language prompts.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dantalan/baatjie-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server