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

# Hosting MCP tools

> Read and manage Embeddables Hosting through the remote MCP server

The Embeddables MCP server exposes hosting reads and writes at
`https://mcp.embeddables.com/mcp`. Every hosting tool checks project membership and uses the same
services as `/hosting/v1`.

Reads require `project.read`; writes require `project.write`.

## Reads

<AccordionGroup>
  <Accordion title="hosting_get_project" description="Read project hosting enrollment">
    <ParamField body="project_id" type="string" required>Project UUID.</ParamField>
    <ResponseField name="result" type="object">`{ slug, enrolled, app_count }`.</ResponseField>
    Fails when the project is missing or the caller lacks `project.read`.
  </Accordion>

  <Accordion title="hosting_list_apps" description="List registered apps">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ResponseField name="apps" type="HostingApp[]">
      Registered apps.
    </ResponseField>

    Fails when the caller lacks `project.read`.
  </Accordion>

  <Accordion title="hosting_list_deploy_keys" description="List deploy-key metadata">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ResponseField name="deploy_keys" type="HostingDeployKey[]">
      Id, prefix, creation, revocation, and last-used timestamps; never the secret or hash.
    </ResponseField>

    Fails when the caller lacks `project.read`.
  </Accordion>

  <Accordion title="hosting_list_domains" description="List an app's custom domains">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ParamField body="app_id" type="string" required>
      Hosting app UUID.
    </ParamField>

    <ResponseField name="domains" type="HostingDomain[]">
      Domains and their status.
    </ResponseField>

    Fails when an id is invalid or the caller lacks `project.read`.
  </Accordion>

  <Accordion title="hosting_get_production" description="Read the production alias">
    <ParamField body="project_id" type="string" required>Project UUID.</ParamField>
    <ParamField body="app_id" type="string" required>Hosting app UUID.</ParamField>
    <ResponseField name="result" type="object">`{ production_label, script_name, updated_at }`.</ResponseField>
    Fails when production does not exist or the caller lacks `project.read`.
  </Accordion>

  <Accordion title="hosting_list_promotions" description="List production changes">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ParamField body="app_id" type="string" required>
      Hosting app UUID.
    </ParamField>

    <ParamField body="limit" type="number">
      1–100.
    </ParamField>

    <ResponseField name="promotions" type="HostingPromotion[]">
      Promotions, newest first.
    </ResponseField>

    Fails for invalid input or missing `project.read`.
  </Accordion>

  <Accordion title="hosting_list_deploys" description="List an app's commit builds">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ParamField body="app_id" type="string" required>
      Hosting app UUID.
    </ParamField>

    <ParamField body="limit" type="number">
      1–100; defaults to 20.
    </ParamField>

    <ResponseField name="deploys" type="HostingDeploy[]">
      Commit builds, newest first.
    </ResponseField>

    <ResponseField name="production" type="HostingPreview & { script_name: string } | null">
      What production serves now.
    </ResponseField>

    Fails for invalid input or missing `project.read`.
  </Accordion>

  <Accordion title="hosting_list_previews" description="List previews for one git branch">
    <ParamField body="project_id" type="string" required>Project UUID.</ParamField>
    <ParamField body="branch" type="string" required>Git branch name.</ParamField>
    <ResponseField name="previews" type="HostingPreview[]">Preview URLs across the project's apps.</ResponseField>
    Fails for an empty branch or missing `project.read`.
  </Accordion>
</AccordionGroup>

## Writes

<AccordionGroup>
  <Accordion title="hosting_enroll_project" description="Set the project slug once">
    <ParamField body="project_id" type="string" required>Project UUID.</ParamField>
    <ParamField body="slug" type="string" required>A 3–16 character hosting slug.</ParamField>
    <ResponseField name="result" type="object">`{ slug, enrolled, app_count }`.</ResponseField>
    Fails for an invalid, locked, or already-taken slug, a missing project, or missing `project.write`.
  </Accordion>

  <Accordion title="hosting_create_app" description="Register an app">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ParamField body="slug" type="string" required>
      A unique 3–12 character app slug.
    </ParamField>

    <ParamField body="repo_path" type="string | null">
      Optional repository path.
    </ParamField>

    <ParamField body="production_branch" type="string">
      Defaults to `main`.
    </ParamField>

    <ResponseField name="app" type="HostingApp">
      Created app.
    </ResponseField>

    Fails for invalid input, an unenrolled project, a duplicate slug, or missing `project.write`.
  </Accordion>

  <Accordion title="hosting_update_app" description="Update app settings">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ParamField body="app_id" type="string" required>
      Hosting app UUID.
    </ParamField>

    <ParamField body="repo_path" type="string | null">
      New repository path.
    </ParamField>

    <ParamField body="production_branch" type="string">
      New production branch.
    </ParamField>

    <ParamField body="confirm" type="true">
      Required only when `production_branch` differs from its current value.
    </ParamField>

    <ResponseField name="app" type="HostingApp">
      Updated app.
    </ResponseField>

    Fails for invalid input, a missing app, an unconfirmed branch change, or missing `project.write`.
  </Accordion>

  <Accordion title="hosting_delete_app" description="Delete an app and its domains">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ParamField body="app_id" type="string" required>
      Hosting app UUID.
    </ParamField>

    <ParamField body="confirm" type="true" required>
      Confirms the deletion.
    </ParamField>

    <ResponseField name="ok" type="true">
      Confirms deletion.
    </ResponseField>

    Fails without confirmation, when the app is missing, or when the caller lacks `project.write`.
  </Accordion>

  <Accordion title="hosting_add_domain" description="Register a custom domain">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ParamField body="app_id" type="string" required>
      Hosting app UUID.
    </ParamField>

    <ParamField body="hostname" type="string" required>
      Full hostname, without a scheme or path.
    </ParamField>

    <ResponseField name="domain" type="HostingDomain">
      Created domain in `pending` status.
    </ResponseField>

    Fails for an invalid or duplicate hostname, a missing app, or missing `project.write`.
  </Accordion>

  <Accordion title="hosting_remove_domain" description="Remove a custom domain">
    <ParamField body="project_id" type="string" required>
      Project UUID.
    </ParamField>

    <ParamField body="app_id" type="string" required>
      Hosting app UUID.
    </ParamField>

    <ParamField body="domain_id" type="string" required>
      Hosting-domain UUID.
    </ParamField>

    <ParamField body="confirm" type="true" required>
      Confirms removal.
    </ParamField>

    <ResponseField name="ok" type="true">
      Confirms removal.
    </ResponseField>

    Fails without confirmation, when the domain is missing, or when the caller lacks `project.write`.
  </Accordion>

  <Accordion title="hosting_promote_preview" description="Promote a preview to production">
    <ParamField body="project_id" type="string" required>Project UUID.</ParamField>
    <ParamField body="app_id" type="string" required>Hosting app UUID.</ParamField>
    <ParamField body="label" type="string" required>Branch or immutable commit preview label.</ParamField>
    <ParamField body="confirm" type="true" required>Confirms the production change.</ParamField>
    <ResponseField name="result" type="object">`{ production_label, script_name }`.</ResponseField>
    Fails without confirmation, when the app or preview is missing, or without `project.write`.
  </Accordion>

  <Accordion title="hosting_create_deploy_key" description="Create a CI deploy key">
    <ParamField body="project_id" type="string" required>Project UUID.</ParamField>
    <ResponseField name="result" type="object">`{ id, prefix, secret, created_at }`.</ResponseField>
    Fails when the caller lacks `project.write`.
  </Accordion>

  <Accordion title="hosting_revoke_deploy_key" description="Revoke a CI deploy key">
    <ParamField body="project_id" type="string" required>Project UUID.</ParamField>
    <ParamField body="key_id" type="string" required>Deploy-key UUID.</ParamField>
    <ParamField body="confirm" type="true" required>Confirms revocation.</ParamField>
    <ResponseField name="ok" type="true">Confirms revocation.</ResponseField>
    Fails without confirmation, when the key is missing, or when the caller lacks `project.write`.
  </Accordion>
</AccordionGroup>

<Warning>
  `hosting_create_deploy_key` returns the plaintext `edk_…` secret once. Move it directly into the
  CI secret store and do not repeat it in chat. Listing deploy keys never returns a secret or hash.
</Warning>

## Domain activation

After you add a domain, follow the dashboard's DNS instructions. Embeddables activates it after
verification.

## Promotion behavior

`hosting_promote_preview` accepts a preview `label`, including an older immutable commit label for
rollback. Promotion changes the production `embd.co` hostname and every active custom domain for the
app, so it always requires `confirm: true`.

Deploys from an app's configured production branch promote automatically and do not use MCP.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.