@mohammad_noman/saleem-dashboard-mcp
v2.1.1
Published
MCP server for Saleem dashboard tools (21 tools across reads, writes, and agent triggers)
Readme
Saleem Dashboard MCP Server
This MCP server wraps the Saleem internal dashboard API routes as tools, so Claude can query live data and trigger agents directly from a conversation.
Team goal
Use this MCP server from Claude Desktop without cloning this repository or using machine-specific paths.
What it does
Exposes 21 tools to Claude, grouped by intent:
Reads (14)
| Tool | Description |
|---|---|
| get_pipeline_health | Deals exceeding SLA thresholds, sorted by days stalled |
| get_funnel_data | Mixpanel consultation funnel conversion rates (last 30 days) |
| get_kpi_status | All team KPIs with on_track / at_risk / behind status |
| get_urgent_items | Unresolved urgent items, filterable by owner / priority |
| get_deal_priorities | Fatima's morning list: new leads, at-risk deals, today's follow-ups |
| get_weekly_brief | Latest compiled weekly brief from all agents |
| get_crm_data | One slice of Zoho CRM data (resource: leads, deals, pipeline, journey, sla, metrics, lead-sources, lead-funnel, subtype, funnel) |
| get_financials | Zoho Books financial data (resource: revenue, burn-rate, invoices, outstanding) |
| get_appointments | Upcoming and recent appointments with doctor and patient details |
| get_marketing_data | Mixpanel marketing data (resource: overview, retention, top-events, traffic, discovery, payment-health, ux-signals, lead-engagement, funnel-anomaly) |
| get_novo_channel | Novo partner channel performance: 6 funnels + 4 supporting insights (period: 7d/30d/90d) |
| get_project_tasks | Zoho Projects tasks from saleem_it or saleem_cross, with optional person/status filters |
| get_kpi_deliverables | KPI deliverables filtered by period, owner, tier, or status |
| get_agent_runs | Most recent run record per agent, used to diagnose agent health |
Writes (6)
| Tool | Description |
|---|---|
| create_urgent_item | Create a new urgent item visible on the team dashboard |
| resolve_urgent_item | Mark an urgent item as resolved |
| create_kpi_target | Create or upsert a KPI target for a person/metric/period |
| update_kpi_target | Update the target value for an existing KPI target (same endpoint, upserts) |
| create_kpi_deliverable | Create a new KPI deliverable (monthly objective) |
| update_kpi_deliverable | Partially update a KPI deliverable by uuid or kpi_key slug |
Agent trigger (1)
| Tool | Description |
|---|---|
| run_agent | Trigger a diagnostic agent and return its output |
File layout
The MCP server is split across these files:
mcp/
├── saleem-dashboard-mcp.js Thin dispatcher: imports tool modules, routes JSON-RPC calls
├── lib/
│ └── dash-fetch.js Shared HTTP helper with x-mcp-key header
└── tools/
├── reads.js 14 read tools (READ_TOOLS + dispatchRead)
├── writes.js 6 write tools (WRITE_TOOLS + dispatchWrite)
└── agents.js run_agent tool (AGENT_TOOLS + dispatchAgent)To add a new tool, append it to the appropriate module: define the function, add a tool definition to the exported array, add a case to the dispatch function. The main dispatcher picks it up automatically.
Running locally
cd mcp
npm install
node saleem-dashboard-mcp.jsYou should see:
[mcp] Saleem Dashboard MCP server runningPublish once, run anywhere
This package is configured as a public scoped package under your npm username, so teammates can install it through npx without private-package billing.
1) Rotate and set the service key
- Generate a new
MCP_SERVICE_KEY. - Set that key in Vercel project environment variables (Production and Preview).
- Share the key only through your team secret manager.
2) Publish the MCP package
cd mcp
npm login
npm publish --access publicIf you later decide to move to a private registry, the same package structure still works; only the publish command and teammate auth change.
3) Add the server in Claude Desktop (team config)
Open Claude Desktop config:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\\Claude\\claude_desktop_config.json
Use this block:
{
"mcpServers": {
"saleem-dashboard": {
"command": "npx",
"args": ["-y", "@mohammad_noman/[email protected]"],
"env": {
"DASHBOARD_BASE_URL": "https://analytics-dashboard-five-gamma.vercel.app",
"MCP_SERVICE_KEY": "YOUR_ROTATED_KEY"
}
}
}
}Notes:
- Pin the package version in
argsfor stable behavior. - Bump version and update the pinned version when releasing updates.
Adding to Claude Desktop
Open ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows) and add:
{
"mcpServers": {
"saleem-dashboard": {
"command": "npx",
"args": ["-y", "@mohammad_noman/[email protected]"],
"env": {
"DASHBOARD_BASE_URL": "https://analytics-dashboard-five-gamma.vercel.app",
"MCP_SERVICE_KEY": "YOUR_ROTATED_KEY"
}
}
}
}Restart Claude Desktop after saving. You should see "saleem-dashboard" appear in the tools panel.
Verifying it works
Run the smoke test (reads from the live dashboard):
node mcp/test.jsThis calls get_pipeline_health, get_kpi_status, and get_urgent_items directly and prints the results.
Required environment variables
| Variable | Where | Description |
|---|---|---|
| DASHBOARD_BASE_URL | MCP server env | Base URL of the deployed dashboard |
| MCP_SERVICE_KEY | MCP server env and Vercel env | Shared secret, must match on both sides |
Set MCP_SERVICE_KEY as a Vercel environment variable (Production + Preview) so the deployed API routes accept requests from the MCP server.
Release checklist
- Update code in this folder.
- Bump version in
mcp/package.json. - Run
npm pack --dry-runfrommcp. - Publish with
npm publish --access public. - Share the new pinned version string with the team.
How authentication works
The MCP server sends x-mcp-key: <MCP_SERVICE_KEY> on every request. API routes that normally require a session cookie check for this header first via isMcpRequest(request); when it matches, the session check (and any role check) is skipped and the request is allowed to proceed. The audit log records the actor as mcp for any write performed this way. The key is never exposed to the browser.
