npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@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.js

You should see:

[mcp] Saleem Dashboard MCP server running

Publish 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

  1. Generate a new MCP_SERVICE_KEY.
  2. Set that key in Vercel project environment variables (Production and Preview).
  3. Share the key only through your team secret manager.

2) Publish the MCP package

cd mcp
npm login
npm publish --access public

If 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 args for 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.js

This 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

  1. Update code in this folder.
  2. Bump version in mcp/package.json.
  3. Run npm pack --dry-run from mcp.
  4. Publish with npm publish --access public.
  5. 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.