Skip to content

feat: Add deleteProject() / deleteScreen() SDK methods and MCP tools (API key support) #364

Description

@meiseayoung

Summary

The SDK and Stitch MCP server currently lack first-class support for deleting projects and deleting screens. Integrators building programmatic UI design workflows (create → iterate → delete) must resort to undocumented REST endpoints or manual cleanup in the Stitch web UI.

Current SDK surface

The public API supports creating and reading resources, but not deleting them:

Resource Create Read Delete
Project createProject() / create_project projects() / list_projects
Screen generate() / generate_screen_from_text screens() / get_screen

Available MCP tools today (from listTools()):

create_project, get_project, list_projects, list_screens, get_screen,
generate_screen_from_text, edit_screens, generate_variants

No delete_project or delete_screen tool is exposed.

Impact

Downstream apps that manage Stitch projects on behalf of users cannot reliably clean up remote resources when a local project or screen is removed. In practice we observe:

  1. No MCP delete toolslistTools() returns no delete/remove tools; callers must probe for undocumented tool names.
  2. REST delete requires OAuth — Direct calls to the Stitch REST API fail with API keys:
    • DELETE /v1/projects/{projectId}403 PERMISSION_DENIED or 401 ("API keys are not supported by this API. Expected OAuth2 access token")
    • DELETE /v1/projects/{projectId}/screens/{screenId} → same
    • POST /v1/projects/{projectId}:delete / screens:batchDelete404 NOT_FOUND (not exposed via MCP httpPost)
  3. Partial canvas-only workaround — Removing a screen from the project canvas via PATCH screenInstances sometimes works with API keys, but does not delete the underlying screen resource.

Users are forced to manually delete projects/screens at stitch.withgoogle.com, breaking automated agent and BYOK integration flows.

Requested API

SDK (domain classes)

// Stitch / Project
await project.delete();           // or stitch.deleteProject(projectId)

// Screen
await screen.delete();            // deletes screen resource + removes from canvas

Both methods should:

  • Work with STITCH_API_KEY (BYOK), not only OAuth
  • Throw typed StitchError with NOT_FOUND if already deleted (idempotent)
  • Return void on success

MCP tools

Tool Parameters Behavior
delete_project { projectId: string } or { name: "projects/{id}" } Permanently delete project and all screens
delete_screen { projectId: string, screenId: string } Delete screen resource and remove from project canvas

REST (if applicable)

Document and enable with API keys:

  • DELETE https://stitch.googleapis.com/v1/projects/{projectId}
  • DELETE https://stitch.googleapis.com/v1/projects/{projectId}/screens/{screenId}

Expected behavior

import { stitch } from "@google/stitch-sdk";

const project = stitch.project("1234567890");
const screens = await project.screens();

// Delete a single screen
await screens[0].delete();
expect(await project.screens()).not.toContainEqual(screens[0]);

// Delete entire project
await project.delete();
expect(await stitch.projects()).not.toContainEqual(expect.objectContaining({ projectId: "1234567890" }));

Environment

  • @google/stitch-sdk ^0.3.5
  • Auth: STITCH_API_KEY (BYOK)
  • Node.js 22

Happy to share integration details or help test a fix.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions