baatjie-mcp-server
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | Port for HTTP transport. | 3000 |
| TANOS_URL | Yes | The URL of the tanOS Supabase project. | |
| TRANSPORT | No | Transport mode: 'stdio' or 'http'. | stdio |
| SIGSCHE_URL | Yes | The URL of the sigscheCore Supabase project. | |
| TANOS_SERVICE_KEY | Yes | The service role key for tanOS. | |
| SIGSCHE_SERVICE_KEY | Yes | The service role key for sigscheCore. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| baatjie_describe_schemaA | List every table reachable through this server, with row counts and column names. Call this first when you are unsure which table or column to use. It is the cheapest way to orient before querying. Args:
Returns: { "projects": { "tanos": { "tables": [{ "name": string, "columns": string[] }] }, "sigsche": { "tables": [...] } } } tanOS tables: Property: landlords, properties, rooms, tenants, foreign_nationals, leases, lease_agreements, payments, maintenance, notices Commercial: locare_accounts, brms, agents, employers, policies, daily_activity Internal: todos, ai_agents, audit_log sigscheCore tables: profiles, queue_items, library_items, brand_cards, registration_status |
| baatjie_queryA | Read rows from any table in tanOS or sigscheCore, with filtering, column selection, ordering and pagination. This is the general-purpose read. For sequencing work prefer baatjie_next_actions, and for the ops snapshot prefer baatjie_dashboard — both are cheaper and better shaped. Personal identifiers (ID numbers, passport numbers, phone, email, banking details) are withheld unless include_pii is true, and the response reports which fields were withheld. Args:
Returns: { "total": number, "count": number, "offset": number, "items": object[], "has_more": boolean, "next_offset"?: number, "redacted_fields": string[] } Examples:
Error Handling:
tanOS tables: Property: landlords, properties, rooms, tenants, foreign_nationals, leases, lease_agreements, payments, maintenance, notices Commercial: locare_accounts, brms, agents, employers, policies, daily_activity Internal: todos, ai_agents, audit_log sigscheCore tables: profiles, queue_items, library_items, brand_cards, registration_status |
| baatjie_insertA | Insert one or more rows into any table in tanOS or sigscheCore. Every insert is recorded in tanOS audit_log with the actor you supply. Args:
Returns: { "ok": true, "table": string, "action": "insert", "affected": number, "rows": object[], "audit_logged": boolean, "note"?: string } Examples:
Note: writes to occupant-facing tables (tenants, leases, notices, payments) are flagged in the response, because a row there corresponds to a real person's tenancy or money. A 'notices' row in particular represents a notice served on an occupant — South African arrears and eviction notices carry statutory requirements, so route the wording through your legal-exposure-check skill before sending rather than after. Error Handling:
|
| baatjie_updateA | Update rows matching a filter, in any table in either system. At least one filter is required — an unfiltered update is refused rather than rewriting the whole table. Recorded in tanOS audit_log. Args:
Returns: { "ok": true, "table": string, "action": "update", "affected": number, "rows": object[], "audit_logged": boolean } Examples:
Error Handling:
|
| baatjie_deleteA | Permanently delete rows matching a filter. Requires confirm=true and at least one filter. Recorded in tanOS audit_log. Deletes are irreversible and there is no soft-delete on these tables. Prefer a status change (baatjie_update) over deletion wherever the schema has a status column — the ledger is append-only by design, and payment corrections belong as compensating rows rather than deletions. Args:
Returns: { "ok": true, "table": string, "action": "delete", "affected": number, "audit_logged": boolean } Error Handling:
|
| baatjie_next_actionsA | Return the todos that are genuinely startable right now — every blocker done — ranked by how much each one unblocks downstream. This is the tool to reach for when asked "what should I do next", "what's the priority", or "what's blocking us". A raw todo list hides the fact that most items cannot be started; this one answers the question the list is standing in for. Args:
Returns: { "startable": [{ "id","title","priority","track","wave","effort","unblocks" }], "blocked_count": number, "roots": [...], // startable items that unblock the most "summary": { "total","startable","blocked","by_priority": {...} } } Examples:
Error Handling:
|
| baatjie_list_todosA | List todos with their wave, track, effort, blocker count and unblock count. Use this for a full picture of the board. For "what do I do next", baatjie_next_actions is the better tool because it filters to what is actually actionable. Args:
Returns: { "total","count","offset","items":[...],"has_more","next_offset"? } where each item carries id, title, priority, status, wave, track, effort, open_blockers, startable and unblocks. Examples:
|
| baatjie_create_todoA | Add a todo to the tanOS action plan, optionally with sequencing metadata. Args:
Returns: { "ok": true, "todo": { "id","title",... }, "audit_logged": boolean } Examples:
|
| baatjie_update_todoA | Change a todo's status or sequencing metadata by id. Marking an item done automatically unblocks anything that listed it in blocked_by — the dependency graph is recomputed on read, so the next call to baatjie_next_actions will surface newly available work. Args:
Returns: { "ok": true, "todo": {...}, "newly_unblocked": [{ "id","title" }], "audit_logged": boolean } Examples:
|
| baatjie_dashboardA | One call for the whole operational picture: row counts across every tanOS table, the sales position against the 26/day objective, and where the clock sits in the BDOP day (phase, 33/22 sprint block, next angel window). This is the cheapest way to orient at the start of a session or a sprint. It replaces roughly a dozen separate count queries. Args:
Returns: { "counts": { "": number | null }, "sales": { "accounts_signed": number, "daily_target": 26, "brms": number, "agent_pool": number, "employer_pool": number, "inherited_book": number }, "property": { "landlords","properties","rooms","tenants","leases", "payments","notices","maintenance" }, "clock": { "phase","sprint","block","minutes_left","next_angel_window" } } Examples:
Error Handling:
|
| baatjie_pipelineA | Roll up sales performance per Business Relationship Manager: inherited book size, agencies signed, and logged outreach/demo/sale activity. Answers "who is performing", "where is the pipeline", and "are we hitting 26/day". Args:
Returns: { "brms": [{ "brm_id","inherited_book_size","accounts_signed", "outreach","demos","sales" }], "totals": { "accounts_signed","outreach","demos","sales","brm_count" }, "against_target": { "daily_target": 26, "signed_today": number, "gap": number } } Examples:
Error Handling:
|
| baatjie_log_activityA | Record a BRM's outreach, demos and sales for a 33/22 sprint block. This is how the daily 26/day objective gets measured — unlogged work is invisible to baatjie_pipeline. Args:
Returns: { "ok": true, "activity": {...}, "clock": {...}, "audit_logged": boolean } Examples:
|
| baatjie_arrearsA | Identify active leases with no recent payment, ranked by days since last payment, alongside how many notices have already been sent on each. Read-only. It reports the position; it does not send anything. Serving a notice is a separate, deliberate act — in South Africa arrears and eviction notices carry statutory requirements under the Rental Housing Act and PIE Act, so wording and timing should be checked before anything reaches an occupant. Args:
Returns: { "leases": [{ "lease_id","room_id","rent_due_day","status", "last_payment_date","days_since_payment","total_paid","notices_sent" }], "summary": { "active_leases","in_arrears","never_paid","total_notices_sent" } } Examples:
Error Handling:
|
| baatjie_signal_queueA | List scheduled, sent and failed posts in the sigscheCore broadcast queue, optionally filtered by brand, status or date. Args:
Returns: { "total","count","offset","items":[{ "id","brand_name","scheduled_date", "scheduled_time","angel_label","platforms","status","caption","is_ad" }], "has_more","next_offset"? } Examples:
|
| baatjie_schedule_signalA | Queue a post or ad for broadcast across platforms, with angel-window awareness. If the scheduled time matches one of the reserved windows (08:17, 11:11, 13:13, 22:22) the angel label is set automatically and reported back. Times outside those windows are accepted without complaint — the label is simply null. Args:
Returns: { "ok": true, "item": {...}, "angel_label": string | null, "audit_logged": boolean } Examples:
Error Handling:
|
| baatjie_brand_snapshotA | Per-brand status across sigscheCore: platform registration progress, queued and sent counts, library depth and how many brand cards exist. Answers "is this brand ready to broadcast" and "where are we still unregistered". Args:
Returns: { "brands": [{ "brand_id","queued","sent","failed","library_items", "brand_cards","platforms_registered","platforms_pending" }], "totals": { "brands","queued","sent","registered" } } Examples:
|
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 16 tools
Tools are mostly distinct: generic CRUD (query/insert/update/delete) is clearly separated from specialized reads like dashboard, pipeline, arrears, and signal_queue. A few overlaps exist (e.g., baatjie_query could be used for many read needs), but descriptions guide to the specialized tools, so confusion is minimal.
All tools share the 'baatjie_' prefix and mostly use snake_case with verb_noun patterns (schedule_signal, list_todos, create_todo, update_todo, log_activity). However, some are noun-only (dashboard, pipeline, arrears, signal_queue, brand_snapshot), which is a minor deviation from the otherwise consistent pattern.
With 16 tools, the server sits just above the ideal 3-15 range but feels justified given the two subsystems (tanOS and sigscheCore) and the combination of generic CRUD plus domain-specific reads/actions. The count is manageable and not bloated.
Generic CRUD tools (query/insert/update/delete) cover virtually all tables, while specialized tools like baatjie_next_actions, baatjie_pipeline, baatjie_arrears, and baatjie_signal_queue provide high-level views. Minor gaps like a specific cancel_signal or update_signal are covered by the generic update/delete, so there are no critical dead ends.