Developers
Hosted MCP
WePeople hosts a Model Context Protocol server at /api/mcp. Authenticated clients read the same monitoring surfaces your team sees — people, presence, scores, and daily rollups — without write access.
Overview
Endpoint: https://wepeople.app/api/mcp (Streamable HTTP). Create a token under Organization → Developer → MCP access, then point your MCP client at that URL with a Bearer header.
This is separate from the Ingest API: ingest uses wp_live_* keys to push events; MCP uses wp_mcp_* tokens to read panel data out.
Authentication
Tokens are opaque secrets shaped like wp_mcp_<43 url-safe chars>. The full plaintext is shown once at creation; the UI lists tokens by prefix only.
- Any member with MONITORING READ can mint a token for their own membership.
- ADMIN/OWNER can view and revoke anyone’s tokens in the org.
- Revoked or expired tokens return 401 with
invalid_keyorkey_expired.
Connect a client
Example Cursor MCP config — replace the bearer value with your generated token.
{
"mcpServers": {
"wepeople": {
"url": "https://wepeople.app/api/mcp",
"headers": {
"Authorization": "Bearer wp_mcp_<your-token>"
}
}
}
}Tools
Read tools mirror the monitoring panel. Credential material is stripped from responses; identity fields (email, Slack/GitHub ids) are included so clients can reason about people.
get_org_context
MONITORING READ (teams if TEAMS READ)| Input | Type | Description |
|---|---|---|
| — | none | No input parameters |
list_people
PEOPLE READ| Input | Type | Description |
|---|---|---|
| enabledOnly | boolean? | When true (default), only enabled monitors. |
get_monitoring_dashboard
MONITORING READ| Input | Type | Description |
|---|---|---|
| from | string | Start date YYYY-MM-DD (org timezone). |
| to | string | End date YYYY-MM-DD (org timezone). |
| teamId | string? | Optional team filter id. |
| workers | enum? | Optional: human | agent | all. |
get_person_detail
MONITORING READ| Input | Type | Description |
|---|---|---|
| monitorId | string | MonitoredSlackUser id (from list_people). |
| from | string | Start date YYYY-MM-DD. |
| to | string | End date YYYY-MM-DD. |
get_presence
MONITORING READ| Input | Type | Description |
|---|---|---|
| monitorIds | string[] | MonitoredSlackUser ids (1–80). |
get_scores
SCORES READ| Input | Type | Description |
|---|---|---|
| workerId | string | Worker id from list_people. |
| period | enum? | DAILY | WEEKLY | MONTHLY (default DAILY). |
| from | string? | Optional from dateKey. |
| to | string? | Optional to dateKey. |
| limit | integer? | 1–365, optional row cap. |
get_statistic_rollups
MONITORING READ| Input | Type | Description |
|---|---|---|
| from | string | Start date YYYY-MM-DD. |
| to | string | End date YYYY-MM-DD. |
| pillar | string? | Comma-separated StatisticPillar values. |
| statisticId | string? | Comma-separated statistic ids. |
| workerId | string? | Optional worker filter. |
Privileges
Tool access uses the same RBAC as the product UI. Defaults:
- MONITORING / PEOPLE / SCORES / TEAMS READ — VIEWER and above.
- If a token has a non-empty
scopeslist, each tool requires matchingSCOPE:ACTIONorSCOPE:*. - Organizations blocked for billing/compliance cannot use MCP until resolved.
Security
- Auth context never retains the bcrypt hash after verification.
/api/mcpdoes not advertise open browser CORS — desktop MCP clients do not need it.- Treat
wp_mcp_*tokens like passwords; rotate by revoking and creating a new one.
Rate limits
Sliding-window limits (in-memory per process): 30 req/s per token and 120 req/s per organization. Exceeded budgets return HTTP 429 with standard rate-limit headers.