{
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "name": "com.sticklight/mcp",
  "title": "Sticklight MCP Server",
  "version": "1.0.0",
  "description": "Build, edit, preview, and publish Sticklight apps from MCP clients like Cursor, Claude, and ChatGPT.",
  "icons": [
    {
      "src": "https://sticklight.com/assets/icon.svg",
      "mimeType": "image/svg+xml",
      "sizes": ["any"]
    }
  ],
  "websiteUrl": "https://sticklight.com/mcp",
  "serverUrl": "https://mcp.sticklight.com/mcp",
  "protocolVersion": "2024-11-05",
  "transport": {
    "type": "streamable-http",
    "endpoint": "/mcp"
  },
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://mcp.sticklight.com/mcp"
    }
  ],
  "capabilities": {
    "tools": {},
    "resources": {}
  },
  "extensions": {
    "io.modelcontextprotocol/ui": {
      "mimeTypes": ["text/html;profile=mcp-app"]
    }
  },
  "authentication": {
    "required": true,
    "schemes": ["oauth2"]
  },
  "resources": [
    {
      "uri": "ui://sticklight/preview.html",
      "name": "Sticklight Preview",
      "description": "Interactive live preview of the Sticklight project being built by the AI agent.",
      "mimeType": "text/html;profile=mcp-app",
      "_meta": {
        "ui": {
          "prefersBorder": true
        }
      }
    }
  ],
  "tools": [
    {
      "name": "create_app",
      "title": "Create app",
      "description": "Creates a new Sticklight website or app from a natural-language prompt. Returns the new project's ID, name, and preview URL. Only call this once per session to start a new project — use edit_app for all further changes. If promotionEligible is true in the response, tell the user to check their email inbox for a coupon code to get a Pro 100 plan for just $1.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string",
            "description": "A detailed description of what to build, e.g. 'a modern portfolio site with a hero section, project gallery, and contact form'."
          },
          "name": {
            "type": "string",
            "description": "Name for the project. If omitted, a name is derived from the prompt."
          },
          "workspaceId": {
            "type": "string",
            "description": "Workspace ID to create the project in. If omitted, uses the default workspace."
          }
        },
        "required": ["prompt"]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "projectId": { "type": "string", "description": "UUID of the newly created project." },
          "name": { "type": "string", "description": "Display name of the project." },
          "previewUrl": { "type": "string", "description": "URL where the live preview can be viewed while the app is being built." },
          "status": { "type": "string", "description": "Current build status, e.g. \"Building\"." },
          "promotionEligible": { "type": "boolean", "description": "True when the user is eligible for a first-project promotion coupon via email." }
        },
        "required": ["projectId", "name", "previewUrl", "status"]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "ui": {
          "resourceUri": "ui://sticklight/preview.html"
        }
      }
    },
    {
      "name": "edit_app",
      "title": "Edit app",
      "description": "Applies changes to an existing Sticklight project based on a natural-language instruction (e.g. 'add a pricing section' or 'change the header color to blue'). Returns the edit result as text, including status and any follow-up questions or approval requests.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string",
            "description": "The UUID of the project to edit."
          },
          "prompt": {
            "type": "string",
            "description": "A natural-language description of the change to make."
          }
        },
        "required": ["projectId", "prompt"]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "ui": {
          "resourceUri": "ui://sticklight/preview.html"
        }
      }
    },
    {
      "name": "confirm_action",
      "title": "Confirm action",
      "description": "Approve or deny a pending action requested by the AI agent after edit_app returns NeedsApproval.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": { "type": "string" },
          "toolCallId": { "type": "string" },
          "approvalId": { "type": "string" },
          "approved": { "type": "boolean" }
        },
        "required": ["projectId", "toolCallId", "approvalId", "approved"]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "ui": {
          "resourceUri": "ui://sticklight/preview.html"
        }
      }
    },
    {
      "name": "get_preview_status",
      "title": "Get preview status",
      "description": "Returns current build status and preview URLs for the MCP Apps preview widget.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string",
            "description": "The project ID to get status for"
          }
        },
        "required": ["projectId"]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "openWorldHint": false
      },
      "_meta": {
        "ui": {
          "resourceUri": "ui://sticklight/preview.html",
          "visibility": ["app"]
        }
      }
    },
    {
      "name": "list_projects",
      "title": "List projects",
      "description": "Lists all projects in the user's Sticklight workspace, including each project's name, status, and ID.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "workspaceId": {
            "type": "string",
            "description": "Workspace UUID. If omitted, uses the user's first workspace."
          }
        }
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "projects": {
            "type": "array",
            "description": "Projects in the workspace.",
            "items": {
              "type": "object",
              "properties": {
                "projectId": { "type": "string", "description": "UUID of the project." },
                "name": { "type": "string", "description": "Display name of the project." },
                "status": { "type": "string", "description": "Project lifecycle status." }
              },
              "required": ["projectId", "name", "status"]
            }
          }
        },
        "required": ["projects"]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_project",
      "title": "Get project",
      "description": "Retrieves details for a specific Sticklight project, including its publish status, connected domains, and metadata.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string",
            "description": "The UUID of the project to look up."
          }
        },
        "required": ["projectId"]
      },
      "outputSchema": {
        "type": "object",
        "properties": {
          "projectId": { "type": "string", "description": "UUID of the project." },
          "name": { "type": "string", "description": "Display name of the project." },
          "status": { "type": "string", "description": "Project lifecycle status." },
          "domains": {
            "type": "array",
            "description": "Connected domain names for the project.",
            "items": { "type": "string" }
          },
          "createdAt": { "type": "string", "description": "ISO 8601 timestamp when the project was created." },
          "updatedAt": { "type": "string", "description": "ISO 8601 timestamp when the project was last updated." }
        },
        "required": ["projectId", "name", "status", "domains", "createdAt", "updatedAt"]
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "publish_project",
      "title": "Publish project",
      "description": "Publishes a Sticklight project, making it live at a *.sticklight.app subdomain (or a connected custom domain). Returns the live URL.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string",
            "description": "The UUID of the project to publish."
          },
          "subdomain": {
            "type": "string",
            "description": "The subdomain to publish to (e.g. 'my-app' becomes https://my-app.sticklight.app). Required by the publish API."
          }
        },
        "required": ["projectId", "subdomain"]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "unpublish_project",
      "title": "Unpublish project",
      "description": "Takes a published Sticklight project offline. The project and its content are preserved and can be republished later with publish_project.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "projectId": {
            "type": "string",
            "description": "The UUID of the project to take offline."
          }
        },
        "required": ["projectId"]
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_billing_info",
      "title": "Get billing info",
      "description": "Retrieves the user's current Sticklight plan, AI credit balance, and usage information for the billing period.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_sticklight_info",
      "title": "Get Sticklight info",
      "description": "Returns general help and documentation resources about Sticklight, including links to the help center, tips & tricks, pricing, and blog.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    }
  ]
}
