> ## Documentation Index
> Fetch the complete documentation index at: https://docs.getmcpulse.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Connect Slack or Discord

> Admin or owner. Stores an incoming webhook for the account, replacing any existing one for that provider.

The URL's host is checked against the provider's own. That is not tidiness: this value is fetched server-side, so accepting an arbitrary URL would make the API a request forwarder pointed wherever the caller likes. It also catches the ordinary mistake of pasting the app page instead of the webhook, which would otherwise be a connection that silently never posts.



## OpenAPI

````yaml https://api.getmcpulse.com/docs/openapi.json put /v1/account/channels/{kind}
openapi: 3.1.0
info:
  title: MCPulse API
  version: 1.0.0
  description: >-
    Analytics for MCP servers.


    The API is the product — the dashboard is one client and an MCP server will
    be another. Every number here is computed server-side so that both get the
    same answer.


    **Two kinds of auth.** Ingest uses an MCP API key (`mp_live_…`). Everything
    else uses a Supabase access token from the browser session.
servers:
  - url: https://mcpulse-production.up.railway.app
    description: MCPulse API
security: []
tags:
  - name: ingest
    description: What the customer's server sends
  - name: mcps
    description: MCPs and ownership
  - name: metrics
    description: Everything the dashboard reads
  - name: keys
    description: Ingest API keys
  - name: account
    description: Account, team and usage
paths:
  /v1/account/channels/{kind}:
    put:
      tags:
        - account
      summary: Connect Slack or Discord
      description: >-
        Admin or owner. Stores an incoming webhook for the account, replacing
        any existing one for that provider.


        The URL's host is checked against the provider's own. That is not
        tidiness: this value is fetched server-side, so accepting an arbitrary
        URL would make the API a request forwarder pointed wherever the caller
        likes. It also catches the ordinary mistake of pasting the app page
        instead of the webhook, which would otherwise be a connection that
        silently never posts.
      parameters:
        - schema:
            type: string
            enum:
              - slack
              - discord
          required: true
          name: kind
          in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                label:
                  type: string
                  minLength: 1
                  maxLength: 60
                webhook_url:
                  type: string
                  minLength: 1
              required:
                - label
                - webhook_url
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                nullable: true
        '401':
          description: Invalid or missing token
        '403':
          description: Your role does not permit this

````