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

# Tilde Control Plane tools for AI agents

> Explore 79 Tilde Control Plane tools for AI agents in Tilde, including supported authentication and MCP capabilities.

export const ToolProviderDetail = ({provider: fallbackProvider, ProviderLogo, apiUrl = PUBLIC_CATALOG_URL}) => {
  const [provider, setProvider] = useState(fallbackProvider);
  const [toolQuery, setToolQuery] = useState("");
  useEffect(() => {
    const controller = new AbortController();
    const loadProvider = async () => {
      const url = new URL(apiUrl);
      url.searchParams.set("page_size", "100");
      url.searchParams.set("deployment_alias", "latest");
      const response = await fetch(url, {
        signal: controller.signal,
        credentials: "omit",
        headers: {
          Accept: "application/json"
        }
      });
      if (!response.ok) throw new Error(`Catalog request failed: ${response.status}`);
      const page = await response.json();
      const match = (page.items || []).find(item => item.type_id === fallbackProvider.slug);
      if (match) setProvider(providerFromApi(match));
    };
    loadProvider().catch(error => {
      if (error.name !== "AbortError") console.warn("Using bundled provider details", error);
    });
    return () => controller.abort();
  }, [apiUrl, fallbackProvider.slug]);
  const filteredTools = useMemo(() => {
    const normalized = toolQuery.trim().toLowerCase();
    if (!normalized) return provider.tools;
    return provider.tools.filter(([name, description]) => `${name} ${description}`.toLowerCase().includes(normalized));
  }, [provider, toolQuery]);
  return <div className="tp-browser tp-detail">
      <a className="tp-back" href="/docs/tool-providers/index">
        <span aria-hidden="true">←</span> Providers
      </a>
      <div className="tp-detail-header">
        <div>
          <ProviderLogo provider={provider} detail />
          <div className="tp-detail-copy">
            <h2>{provider.name}</h2>
            <p>{provider.summary}</p>
          </div>
        </div>
        <div className="tp-detail-meta">
          <span>{provider.category}</span>
          <a href="https://api.trytilde.ai/tools/available-tool-providers">Add provider</a>
        </div>
      </div>
      <div className="tp-supported-auth">
        <span>Supported auth</span>
        <div className="tp-badges">
          {provider.auth.map(method => <span className="tp-badge" key={method}>
              <svg viewBox="0 0 24 24" aria-hidden="true">
                <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10Z" />
                <path d="m9 12 2 2 4-4" />
              </svg>
              {method}
            </span>)}
        </div>
      </div>
      <section className="tp-tools-panel">
        <div className="tp-tools-heading">
          <div>
            <h3>Available tools</h3>
            <p>{filteredTools.length} shown{provider.tools.length < provider.toolCount ? ` · ${provider.toolCount} in Tilde` : ""}</p>
          </div>
          <label className="tp-search">
            <span className="sr-only">Search tools</span>
            <svg viewBox="0 0 24 24" aria-hidden="true">
              <circle cx="11" cy="11" r="7" />
              <path d="m20 20-3.6-3.6" />
            </svg>
            <input type="search" value={toolQuery} onChange={event => setToolQuery(event.target.value)} placeholder="Search tools..." />
          </label>
        </div>
        <div className="tp-tool-table" role="table" aria-label={`${provider.name} tools`}>
          <div className="tp-tool-row tp-tool-row--header" role="row">
            <span role="columnheader">Tool</span>
            <span role="columnheader">Description</span>
          </div>
          {filteredTools.map(([name, description]) => <div className="tp-tool-row" role="row" key={name}>
              <span role="cell">{name}</span>
              <span role="cell">{description}</span>
            </div>)}
        </div>
      </section>
    </div>;
};

export const ProviderLogo = ({provider, detail = false}) => {
  const sources = provider.iconSources || [iconUrl(provider.slug), iconUrl(provider.name)].filter(Boolean);
  const [sourceIndex, setSourceIndex] = useState(0);
  const source = sources[sourceIndex];
  useEffect(() => setSourceIndex(0), [provider.slug]);
  return <span className={detail ? "tp-detail-logo" : "tp-provider-logo"}>
      {source ? <img src={source} alt="" onError={() => setSourceIndex(index => index + 1)} /> : <span className="tp-logo-fallback">{provider.initials}</span>}
    </span>;
};

export const providerFromApi = source => {
  const metadata = source.metadata || ({});
  const auth = [...new Set((source.credential_sources || []).map(credential => credential.display_name || credential.name).filter(Boolean))];
  return {
    name: source.name,
    slug: source.type_id,
    initials: source.name.replace(/[^a-zA-Z0-9]/g, "").slice(0, 2).toUpperCase(),
    category: String(source.categories?.[0] || "Tools").replaceAll("_", " "),
    summary: source.documentation,
    auth,
    iconSources: [metadata.icon_url, iconUrl(metadata.icon_slug), iconUrl(source.type_id), iconUrl(source.name)].filter(Boolean),
    toolCount: (source.tools || []).length,
    tools: (source.tools || []).map(tool => [tool.name, tool.documentation])
  };
};

export const iconUrl = name => {
  const normalized = String(name || "").toLowerCase().replace(/[_./:]+/g, " ").replace(/\s+/g, " ").trim();
  if (!normalized || (/^(tilde|debug|message internal)\b|internal agent$/).test(normalized)) return null;
  const slug = iconAliases[normalized] || normalized.replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
  return slug ? `https://thesvg.org/icons/${slug}/default.svg` : null;
};

export const iconAliases = {
  "amazon s3": "aws-s3",
  "aws s3": "aws-s3",
  "google bigquery": "google-bigquery",
  "google gmail": "gmail",
  "google mail": "gmail",
  "mongo db": "mongodb",
  "open ai": "openai",
  "vercel ai sdk": "vercel"
};

export const PUBLIC_CATALOG_URL = "https://api.trytilde.ai/api/v1/mcp/available-tool-groups";

export const provider = {
  "name": "Tilde Control Plane",
  "slug": "tilde_control_plane",
  "initials": "TI",
  "category": "Tilde",
  "summary": "Authenticated team-scoped Tilde control-plane tools. Team context is inferred from the MCP server/tool instance; org and team administration tools are intentionally hidden.",
  "auth": ["No Auth"],
  "iconSources": [],
  "toolCount": 79,
  "tools": [["tilde_whoami", "Return the authenticated Tilde identity, organizations, teams, and groups."], ["tilde_enable_toolkit_provider", "Create or configure a toolkit provider instance for a team. Choose a credential_source_type_id from capability search results. When credentials are required, send approval_url to the user and immediately invoke the returned next_tool_name with next_tool_arguments; do not invoke provider tools until the wait completes."], ["tilde_auto_provision_toolkit_provider", "Provision an upstream provider app and its toolkit provider instance. When browser setup is required, send approval_url to the user and immediately invoke the returned next_tool_name with next_tool_arguments. The wait resolves only after provider app setup and any required user credential brokering activate the provider."], ["tilde_set_toolkit_tool_enabled", "Enable or disable one tool inside a configured toolkit provider instance. This does not expose the tool on an MCP server; use tilde_set_mcp_server_tool_enabled for that mapping."], ["tilde_connect_proxied_mcp_server", "Connect an upstream MCP server as a Tilde toolkit provider. When credentials are required, send approval_url to the user and immediately invoke the returned next_tool_name with next_tool_arguments; discovery remains blocked until the wait completes."], ["tilde_refresh_proxied_mcp_server", "Refresh discovery for an existing proxied MCP server after upstream tool changes and redeploy its discovered tools."], ["tilde_register_custom_tool_backend", "Register a custom HTTP tool backend from a signed discovery manifest and deploy its tools immediately."], ["tilde_refresh_custom_tool_backend", "Refresh discovery for an existing custom HTTP tool backend after manifest changes and redeploy its tools."], ["tilde_generate_api_key", "Generate a Tilde API key for a team."], ["tilde_register_chatkit_agent", "Register a Vercel AI SDK compatible HTTP ChatKit agent."], ["tilde_configure_chatkit_provider", "Create a ChatKit provider/channel, or update the reconciled channel when an explicit id is supplied."], ["tilde_create_mcp_server", "Create a Tilde MCP server instance for a team. This creates the server container that can expose enabled toolkit, proxied MCP, and custom backend functions."]]
};

Authenticated team-scoped Tilde control-plane tools. Team context is inferred from the MCP server/tool instance; org and team administration tools are intentionally hidden.

Tilde exposes **79 Tilde Control Plane tools** for AI agents through MCP. Connect with No Auth.

<ToolProviderDetail provider={provider} ProviderLogo={ProviderLogo} />

## Popular Tilde Control Plane tools

* **tilde\_whoami** — Return the authenticated Tilde identity, organizations, teams, and groups.
* **tilde\_enable\_toolkit\_provider** — Create or configure a toolkit provider instance for a team. Choose a credential\_source\_type\_id from capability search results. When credentials are required, send approval\_url to the user and immediately invoke the returned next\_tool\_name with next\_tool\_arguments; do not invoke provider tools until the wait completes.
* **tilde\_auto\_provision\_toolkit\_provider** — Provision an upstream provider app and its toolkit provider instance. When browser setup is required, send approval\_url to the user and immediately invoke the returned next\_tool\_name with next\_tool\_arguments. The wait resolves only after provider app setup and any required user credential brokering activate the provider.
* **tilde\_set\_toolkit\_tool\_enabled** — Enable or disable one tool inside a configured toolkit provider instance. This does not expose the tool on an MCP server; use tilde\_set\_mcp\_server\_tool\_enabled for that mapping.
* **tilde\_connect\_proxied\_mcp\_server** — Connect an upstream MCP server as a Tilde toolkit provider. When credentials are required, send approval\_url to the user and immediately invoke the returned next\_tool\_name with next\_tool\_arguments; discovery remains blocked until the wait completes.
* **tilde\_refresh\_proxied\_mcp\_server** — Refresh discovery for an existing proxied MCP server after upstream tool changes and redeploy its discovered tools.
* **tilde\_register\_custom\_tool\_backend** — Register a custom HTTP tool backend from a signed discovery manifest and deploy its tools immediately.
* **tilde\_refresh\_custom\_tool\_backend** — Refresh discovery for an existing custom HTTP tool backend after manifest changes and redeploy its tools.
* **tilde\_generate\_api\_key** — Generate a Tilde API key for a team.
* **tilde\_register\_chatkit\_agent** — Register a Vercel AI SDK compatible HTTP ChatKit agent.
* **tilde\_configure\_chatkit\_provider** — Create a ChatKit provider/channel, or update the reconciled channel when an explicit id is supplied.
* **tilde\_create\_mcp\_server** — Create a Tilde MCP server instance for a team. This creates the server container that can expose enabled toolkit, proxied MCP, and custom backend functions.

## Connect Tilde Control Plane to an AI agent

Add Tilde Control Plane from the [Tilde dashboard](https://api.trytilde.ai/tools/available-tool-providers), then enable the tools your agent needs on an MCP server. [Learn how tools work in Tilde](/docs/tools).

[Browse every Tilde tool provider](/docs/tool-providers/index) or [compare Tilde-managed and self-managed authentication](/docs/tool-providers/managed-auth).
