Boardroom Revenue Control

Read-only sales CRM for AI clients: leads, pipeline, AI-agent chats, calls, ad attribution.

Should I use this

Quality & Safety

B
Description quality
100%
Schema completeness
64%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,728Tokens (tool definitions)
~1.5 KBTypical response size
Significant attention impact (2.13% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "boro-ai": {
      "url": "https://control.boardroom-ai.ae/mcp"
    }
  }
}

Remote endpoints

https://control.boardroom-ai.ae/mcpstreamable-http

What it can do

Tool inventory

Tools (13)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢whoami

Who this token is, which workspace it can read, and which scopes it carries. Call this first: it tells you which of the other tools will work.

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢crm_list_leads(stage, pipeline_id, since, limit, offset)

Leads in this workspace, newest activity first. Phone and email are MASKED here — use crm_get_lead for one record when the full contact is genuinely needed. `total` is the count before paging, so it answers 'how many leads exist'. [scope: crm:read]

Input Schema

{
  "type": "object",
  "properties": {
    "stage": {
      "type": "string",
      "description": "Stage name, exact (case-insensitive). Omit for all stages."
    },
    "pipeline_id": {
      "type": "string",
      "format": "uuid",
      "description": "UUID of one pipeline. Omit for all."
    },
    "since": {
      "type": "string",
      "description": "today | yesterday | week | month | 7d | 30d | ISO timestamp. Days are Asia/Dubai."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50,
      "description": "Maximum number of rows to return."
    },
    "offset": {
      "type": "integer",
      "minimum": 0,
      "maximum": 5000,
      "default": 0,
      "description": "Rows to skip before the first returned row (for paging)."
    }
  },
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢crm_get_lead(lead_id)

One lead — notes, events, stage history and open tasks. Phone, e-mail and messenger ids are MASKED unless this key also holds crm:read_pii, which the workspace owner grants separately. Scoped to this workspace: a lead id from elsewhere reads as not_found. [scope: crm:read]

Input Schema

{
  "type": "object",
  "properties": {
    "lead_id": {
      "type": "string",
      "format": "uuid",
      "description": "UUID of the lead."
    }
  },
  "required": [
    "lead_id"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢crm_pipeline_overview

Every pipeline and stage with its lead count and total value. The shape of the funnel. [scope: crm:read]

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢crm_leads_without_task(limit)

Open leads with no unfinished task against them — the follow-up leak. Sorted by idle time, longest first. Idle days are counted in Asia/Dubai. [scope: crm:read]

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50,
      "description": "Maximum number of rows to return."
    }
  },
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢ad_attribution(since, limit)

Which advertisement produced which conversation: ad id, creative, first-touch flag, and the lead it bound to. The per-click id is NOT returned — only whether one exists. An empty result means no ad-driven conversation has been recorded in the window, not that the tool failed. [scope: marketing:read]

Input Schema

{
  "type": "object",
  "properties": {
    "since": {
      "type": "string",
      "description": "today | week | month | 30d | ISO timestamp (Asia/Dubai days)."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 500,
      "default": 100,
      "description": "Maximum number of rows to return."
    }
  },
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢agent_conversations(since, limit)

Conversations the AI agent handled, with intent, language, message count and the deal they bound to. Contacts masked. [scope: agent:read]

Input Schema

{
  "type": "object",
  "properties": {
    "since": {
      "type": "string",
      "description": "today | week | month | 7d | ISO timestamp (Asia/Dubai days)."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50,
      "description": "Maximum number of rows to return."
    }
  },
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢agent_get_conversation(conversation_id, limit)

One conversation with its transcript — what the customer wrote and what the agent answered. [scope: agent:read]

Input Schema

{
  "type": "object",
  "properties": {
    "conversation_id": {
      "type": "string",
      "format": "uuid",
      "description": "UUID from agent_conversations."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 500,
      "default": 100,
      "description": "Maximum number of rows to return."
    }
  },
  "required": [
    "conversation_id"
  ],
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢dashboard_snapshot

The workspace's own KPI contract as the dashboard renders it, with the time it was built. [scope: crm:read]

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢marketing_snapshot

Advertising performance: spend, reach, clicks, cost per lead, per campaign, plus the CRM join. [scope: marketing:read]

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢agent_config

How the AI agent is set up for this workspace: mode and persona, working hours, hand-over rules, follow-up cadence, trigger list, actions, voice scenarios, and the TITLES of its knowledge documents. Document text is not returned — the list answers what the agent knows about; reading one whole is a separate, narrower ask. No credential of any kind is reachable from here: an agent's instructions are not its keys. [scope: agent:read]

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢partner_overview

This partner's own cabinet: referral code and link, the clients who registered through it, the agreed commission rate, what has accrued so far, and which client workspaces this partner currently holds a grant for. Only answers for a token bound to a partner. [scope: partner:read]

Input Schema

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}
🟢voice_calls(since, limit)

Calls with direction, disposition and talk time. Customer numbers masked. [scope: crm:read]

Input Schema

{
  "type": "object",
  "properties": {
    "since": {
      "type": "string",
      "description": "today | week | month | 7d | ISO timestamp (Asia/Dubai days)."
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 200,
      "default": 50,
      "description": "Maximum number of rows to return."
    }
  },
  "additionalProperties": false
}

Output Schema

{
  "type": "object",
  "properties": {
    "ok": {
      "type": "boolean",
      "description": "False when the call was refused or failed; see error."
    },
    "error": {
      "description": "Machine-readable refusal code (a string), present only when ok is false."
    },
    "message": {
      "description": "Human-readable explanation of a refusal (a string)."
    }
  },
  "additionalProperties": true
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded13 tools