MCP Servers

List MCP Servers

Returns a list of all MCP servers in your organization.

The response includes all configured MCP servers with their current status, configuration, and metadata.

get/api/mcp-servers

Request

  • Base URL: https://app.withwillow.ai
  • URL: https://app.withwillow.ai/api/mcp-servers
  • Auth: HTTP bearer

Query parameters

status'active' | 'draft'

Filter MCP servers by status.

searchstring

Case-insensitive search against MCP server name and description.

include_toolsboolean

Include enabled tools for each server. Deprecated in favor of fields=tools(...).

fieldsstring

Comma-separated list of fields to include in the response. When omitted, all fields are returned. Supports nested field selection using parenthesized syntax — e.g. tools(name,slug,description).

cursorinteger

Zero-based cursor offset for pagination.

limitinteger

Maximum number of MCP servers to return (1-200).

includeTotalboolean

Include the total number of matching MCP servers in totalCount.

Headers

x-willow-groupstring

Scope the returned list to the MCP servers accessible to a specific group, by group name (case-insensitive), instead of the full org-wide list. An unknown group resolves to an empty list rather than an error.

Response

List of MCP servers retrieved successfully

totalCountinteger

Total number of matching MCP servers. Present only when includeTotal=true.

Example response

{
  "data": [
    {
      "id": "mcp_abc123",
      "slug": "my-custom-server",
      "name": "My Custom Server",
      "description": "Custom MCP server for internal tools",
      "status": "active",
      "logo_url": "https://icons.withwillow.ai/connectors/slack.svg",
      "auth_type": "proxy-oauth",
      "tools_count": 12,
      "connection": {
        "url": "https://gateway.example.com/mcp?mcp=my-server",
        "transport": "both"
      },
      "tools": [
        {
          "name": "Send Message",
          "slug": "send-message",
          "description": "Send a message to a Slack channel",
          "risk": "low",
          "inputSchema": {
            "type": "object",
            "properties": {
              "channel": {
                "type": "string",
                "description": "Channel ID or name"
              },
              "text": {
                "type": "string",
                "description": "Message text"
              }
            },
            "required": [
              "channel",
              "text"
            ]
          },
          "annotations": {
            "openWorldHint": true
          },
          "forceApproval": "user",
          "policy_check": {
            "severity": "pass",
            "details": [],
            "checked_at": "2024-01-20T14:45:00Z"
          },
          "ai_risk": {
            "level": "low",
            "score": 12,
            "reasoning": "This tool only sends messages and does not access sensitive data.",
            "calculated_at": "2024-01-20T14:45:00Z"
          }
        }
      ]
    }
  ],
  "pagination": {
    "limit": 100
  },
  "totalCount": 42
}

Changes

No recorded changes to this operation across all 1 revision of this API.