> ## 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.

# Tool providers for AI agents

> Browse Tilde tool providers for AI agents, compare authentication options, and explore MCP tools for GitHub, Slack, Google, Stripe, and more.

export const providers = [{
  "name": "AWS",
  "slug": "aws",
  "initials": "AW",
  "category": "Cloud Infrastructure",
  "summary": "AWS cloud operations, regional availability, documentation, skills, file transfer, and sandboxed multi-step API execution through the official AWS MCP Server. Requests are authenticated with encrypted AWS IAM credentials and SigV4.",
  "auth": ["AWS IAM credentials"],
  "iconSources": [],
  "toolCount": 9,
  "tools": []
}, {
  "name": "E2B Sandbox",
  "slug": "e2b_sandbox",
  "initials": "E2",
  "category": "Sandbox",
  "summary": "E2B sandbox management, filesystem, patch, and command execution tools.",
  "auth": ["E2B API key"],
  "iconSources": [],
  "toolCount": 34,
  "tools": []
}, {
  "name": "Firecrawl",
  "slug": "firecrawl",
  "initials": "FI",
  "category": "Search",
  "summary": "Firecrawl web search, scraping, crawling, extraction, monitor, interact, parse, feedback, agent, and research tools.",
  "auth": ["Firecrawl API key"],
  "iconSources": [],
  "toolCount": 26,
  "tools": []
}, {
  "name": "GitHub",
  "slug": "github",
  "initials": "GI",
  "category": "Developer Tools",
  "summary": "GitHub developer workflow tools for issues, pull requests, code, Actions, checks, releases, reactions, search, users, and organizations.",
  "auth": ["Personal access token", "OAuth app", "GitHub App", "Tilde-managed OAuth"],
  "iconSources": [],
  "toolCount": 78,
  "tools": []
}, {
  "name": "Google Analytics",
  "slug": "google_analytics",
  "initials": "GO",
  "category": "Analytics",
  "summary": "Google Analytics tools for GA4 Admin, Data API reports, audience exports/lists, report tasks, and Measurement Protocol events.",
  "auth": ["Tilde-managed Google OAuth"],
  "iconSources": [],
  "toolCount": 74,
  "tools": []
}, {
  "name": "Google Calendar",
  "slug": "google_calendar",
  "initials": "GO",
  "category": "Calendar",
  "summary": "Google Calendar integration for managing events, scheduling, and calendar access.",
  "auth": ["Tilde-managed OAuth"],
  "iconSources": [],
  "toolCount": 9,
  "tools": []
}, {
  "name": "Google Docs",
  "slug": "google_docs",
  "initials": "GO",
  "category": "Documents",
  "summary": "Google Docs integration for creating, reading, and editing documents.",
  "auth": ["Tilde-managed OAuth"],
  "iconSources": [],
  "toolCount": 6,
  "tools": []
}, {
  "name": "Google Drive",
  "slug": "google_drive",
  "initials": "GO",
  "category": "File Storage",
  "summary": "Google Drive integration for searching, uploading, downloading, and managing files and folders.",
  "auth": ["Tilde-managed OAuth"],
  "iconSources": [],
  "toolCount": 10,
  "tools": []
}, {
  "name": "Google Mail",
  "slug": "google_mail",
  "initials": "GO",
  "category": "Email",
  "summary": "Google Mail integration for sending and reading emails via the Gmail API.",
  "auth": ["Tilde-managed OAuth"],
  "iconSources": [],
  "toolCount": 11,
  "tools": []
}, {
  "name": "Google Search Console",
  "slug": "google_search_console",
  "initials": "GO",
  "category": "Search",
  "summary": "Google Search Console tools for property management, search analytics, URL inspection, indexing diagnostics, and sitemap management.",
  "auth": ["Tilde-managed OAuth"],
  "iconSources": [],
  "toolCount": 19,
  "tools": []
}, {
  "name": "Google Sheets",
  "slug": "google_sheets",
  "initials": "GO",
  "category": "Spreadsheets",
  "summary": "Google Sheets integration for reading, writing, and managing spreadsheet data.",
  "auth": ["Tilde-managed OAuth"],
  "iconSources": [],
  "toolCount": 10,
  "tools": []
}, {
  "name": "Message internal agent",
  "slug": "chatkit_internal_agent",
  "initials": "ME",
  "category": "Chat",
  "summary": "Send messages between paired ChatKit agents through an internal ChatKit session.",
  "auth": ["No Auth"],
  "iconSources": [],
  "toolCount": 1,
  "tools": []
}, {
  "name": "Modal Sandbox",
  "slug": "modal_sandbox",
  "initials": "MO",
  "category": "Sandbox",
  "summary": "Modal sandbox management, filesystem, patch, and command execution tools.",
  "auth": ["Modal token"],
  "iconSources": [],
  "toolCount": 10,
  "tools": []
}, {
  "name": "Payload CMS",
  "slug": "payload",
  "initials": "PA",
  "category": "Documents",
  "summary": "Payload CMS document and global content management tools backed by Payload's REST API.",
  "auth": ["Payload API key"],
  "iconSources": [],
  "toolCount": 7,
  "tools": []
}, {
  "name": "PostHog",
  "slug": "posthog",
  "initials": "PO",
  "category": "Product Analytics",
  "summary": "PostHog product analytics, feature flags, insights, dashboards, cohorts, surveys, experiments, persons, events, annotations, alerts, and project tools backed by direct PostHog REST APIs.",
  "auth": ["PostHog API key"],
  "iconSources": [],
  "toolCount": 66,
  "tools": []
}, {
  "name": "Sentry",
  "slug": "sentry",
  "initials": "SE",
  "category": "Developer Tools",
  "summary": "Sentry issue discovery, event investigation, assignment, status, and activity-note tools. The deduplicated catalog includes 48 official Sentry MCP definitions and 211 Composio aliases; Nango contributes 0 actions. Inputs and outputs use the upstream JSON schemas.",
  "auth": ["Sentry auth token", "Sentry OAuth app", "Tilde-managed OAuth"],
  "iconSources": [],
  "toolCount": 237,
  "tools": []
}, {
  "name": "Slack",
  "slug": "slack",
  "initials": "SL",
  "category": "Chat",
  "summary": "Slack messaging tools backed by a configured Slack bot.",
  "auth": ["Tilde-managed OAuth", "Slack app"],
  "iconSources": [],
  "toolCount": 53,
  "tools": []
}, {
  "name": "Stripe",
  "slug": "stripe",
  "initials": "ST",
  "category": "Payments",
  "summary": "Stripe payment processing integration.",
  "auth": ["API Key"],
  "iconSources": [],
  "toolCount": 1,
  "tools": []
}, {
  "name": "Tavily",
  "slug": "tavily",
  "initials": "TA",
  "category": "Search",
  "summary": "Tavily web search, extraction, crawl, map, research, and account usage tools.",
  "auth": ["Tavily API key"],
  "iconSources": [],
  "toolCount": 6,
  "tools": []
}, {
  "name": "Tilde Browser",
  "slug": "tilde_browser",
  "initials": "TI",
  "category": "Browser",
  "summary": "Browserbase-backed Web Browser tools with Tilde managed credential fill.",
  "auth": [],
  "iconSources": [],
  "toolCount": 0,
  "tools": []
}, {
  "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": []
}, {
  "name": "Tilde Human Approval",
  "slug": "tilde_human_approval",
  "initials": "TI",
  "category": "Tilde",
  "summary": "No-auth Tilde human approval tools that can be added to any MCP server so agents can wait for secure user approvals.",
  "auth": ["No Auth"],
  "iconSources": [],
  "toolCount": 1,
  "tools": []
}, {
  "name": "Tilde Memory Bank",
  "slug": "tilde_memory_bank",
  "initials": "TI",
  "category": "Memory",
  "summary": "Retain, recall, reflect on, and delete documents in one bound Tilde memory bank.",
  "auth": ["No Auth"],
  "iconSources": [],
  "toolCount": 4,
  "tools": []
}, {
  "name": "Tilde Pay",
  "slug": "tilde_wallet",
  "initials": "TI",
  "category": "Pay",
  "summary": "Tilde Pay tools for balances, deposit information, and agent payments.",
  "auth": ["No Auth"],
  "iconSources": [],
  "toolCount": 8,
  "tools": []
}, {
  "name": "Tilde Skill Registry",
  "slug": "tilde_skill_registry",
  "initials": "TI",
  "category": "Tilde",
  "summary": "Registry-specific Tilde skill discovery tools. The registry id is bound server-side on each enabled tool instance.",
  "auth": ["No Auth"],
  "iconSources": [],
  "toolCount": 4,
  "tools": []
}, {
  "name": "Tilde Wiki",
  "slug": "tilde_wiki",
  "initials": "TI",
  "category": "Wiki",
  "summary": "Maintain Markdown pages, semantic relationships, graph queries, revisions, and media assets in one bound Tilde Wiki.",
  "auth": ["No Auth"],
  "iconSources": [],
  "toolCount": 43,
  "tools": []
}];

export const ToolProviderBrowser = ({providers: fallbackProviders, ProviderLogo, apiUrl = PUBLIC_CATALOG_URL}) => {
  const [catalog, setCatalog] = useState(fallbackProviders);
  const [providerQuery, setProviderQuery] = useState("");
  useEffect(() => {
    const controller = new AbortController();
    const loadCatalog = async () => {
      const items = [];
      let nextPageToken;
      do {
        const url = new URL(apiUrl);
        url.searchParams.set("page_size", "100");
        url.searchParams.set("deployment_alias", "latest");
        if (nextPageToken) url.searchParams.set("next_page_token", nextPageToken);
        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();
        items.push(...page.items || []);
        nextPageToken = page.next_page_token;
      } while (nextPageToken);
      const liveProviders = items.map(providerFromApi).sort((a, b) => a.name.localeCompare(b.name));
      if (liveProviders.length) setCatalog(liveProviders);
    };
    loadCatalog().catch(error => {
      if (error.name !== "AbortError") console.warn("Using the bundled tool catalog fallback", error);
    });
    return () => controller.abort();
  }, [apiUrl]);
  const filteredProviders = useMemo(() => {
    const normalized = providerQuery.trim().toLowerCase();
    if (!normalized) return catalog;
    return catalog.filter(provider => [provider.name, provider.category, provider.summary, ...provider.auth].join(" ").toLowerCase().includes(normalized));
  }, [catalog, providerQuery]);
  return <div className="tp-browser">
      <div className="tp-catalog-toolbar">
        <p><span>{filteredProviders.length}</span> providers available</p>
        <label className="tp-search">
          <span className="sr-only">Search providers</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={providerQuery} onChange={event => setProviderQuery(event.target.value)} placeholder="Search providers..." />
        </label>
      </div>
      <div className="tp-provider-grid">
        {filteredProviders.map(provider => <a className="tp-provider-card" href={`/tool-providers/${providerRoute(provider.slug)}`} key={provider.slug}>
            <ProviderLogo provider={provider} />
            <span className="tp-provider-copy">
              <span className="tp-provider-name">{provider.name}</span>
              <span className="tp-provider-summary">{provider.summary}</span>
              <span className="tp-tool-count">
                <svg viewBox="0 0 24 24" aria-hidden="true">
                  <path d="M14.7 6.3a4 4 0 0 0-5-5L8 3l3 3 1.7-1.7a4 4 0 0 0 2 2Z" />
                  <path d="m10 7-8.4 8.4a2 2 0 0 0 0 2.8l4.2 4.2a2 2 0 0 0 2.8 0L17 14" />
                </svg>
                <span>{provider.toolCount}</span> tools
              </span>
              <span 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>)}
              </span>
            </span>
          </a>)}
      </div>
      {filteredProviders.length === 0 && <div className="tp-empty">No providers match “{providerQuery}”.</div>}
    </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 providerRoute = slug => String(slug || "").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");

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";

Browse Tilde integrations for AI agents, including GitHub, Slack, Google Workspace, Stripe, Notion, and more. Search each provider to compare supported authentication methods and inspect its available MCP tools.

The catalog loads provider names, descriptions, tools, authentication methods, and available icon metadata from Tilde's public API. It remains accessible without a Tilde account.

<Card title="Tilde-managed authentication" icon="shield-check" href="/docs/tool-providers/managed-auth">
  Compare Tilde-managed authentication with self-managed credentials.
</Card>

<ToolProviderBrowser providers={providers} ProviderLogo={ProviderLogo} />
