Skip to main content
Glama
nks-hub

rybbit-mcp

by nks-hub

Create Site

rybbit_create_site

Create websites or mobile apps in Rybbit Analytics by specifying domain or package name, organization ID, and site type for tracking integration.

Instructions

Create a new site in Rybbit. Use type 'web' for websites (domain like 'example.com') or type 'app' for mobile apps (package name like 'com.example.app'). Returns the created site with its siteId for tracking integration.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
domainYesDomain of the site (e.g. 'example.com') or package name for apps (e.g. 'com.example.app')
nameNoDisplay name for the site (defaults to domain)
organizationIdYesOrganization ID to add the site to. Use rybbit_list_sites to find organization IDs.
typeNoSite type: 'web' for websites (default), 'app' for mobile apps

Implementation Reference

  • Registration and implementation of the "rybbit_create_site" tool, which creates a new site within a specific organization.
    server.registerTool(
      "rybbit_create_site",
      {
        title: "Create Site",
        description:
          "Create a new site in Rybbit. Use type 'web' for websites (domain like 'example.com') or type 'app' for mobile apps (package name like 'com.example.app'). Returns the created site with its siteId for tracking integration.",
        inputSchema: {
          domain: z
            .string()
            .describe("Domain of the site (e.g. 'example.com') or package name for apps (e.g. 'com.example.app')"),
          name: z
            .string()
            .optional()
            .describe("Display name for the site (defaults to domain)"),
          organizationId: z
            .string()
            .describe(
              "Organization ID to add the site to. Use rybbit_list_sites to find organization IDs."
            ),
          type: z
            .enum(["web", "app"])
            .optional()
            .describe("Site type: 'web' for websites (default), 'app' for mobile apps"),
        },
        annotations: {
          readOnlyHint: false,
          destructiveHint: false,
          idempotentHint: false,
          openWorldHint: true,
        },
      },
      async ({ domain, name, organizationId, type }) => {
        try {
          const isApp = type === "app";
          const data = await client.post<Site>(
            `/organizations/${organizationId}/sites`,
            {
              domain,
              name: name || domain,
              ...(type ? { type } : {}),
              // App sites must have blockBots disabled - Dart/Flutter HTTP UA is detected as bot
              ...(isApp ? { blockBots: false } : {}),
            }
          );
    
          // For app sites, ensure blockBots is disabled via config update
          if (isApp && data.id) {
            try {
              await client.put(`/sites/${data.id}/config`, { blockBots: false });
            } catch {
              // Best-effort, create already set it
            }
          }
    
          return {
            content: [
              {
                type: "text" as const,
                text: truncateResponse({
                  message: `Site '${data.domain}' created successfully${isApp ? " (blockBots disabled for app site)" : ""}`,
                  siteId: data.id,
                  domain: data.domain,
                  name: data.name,
                  organizationId: data.organizationId,
                }),
              },
            ],
          };
        } catch (err) {
          const message = err instanceof Error ? err.message : String(err);
          return {
            content: [{ type: "text" as const, text: `Error: ${message}` }],
            isError: true,
          };
        }
      }
    );
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate write operation (readOnlyHint=false) and non-idempotency. The description adds valuable context beyond annotations: it discloses the return structure (siteId for tracking integration) and explains the dual semantics of the domain parameter (domain vs package name) which behavioral annotations don't cover.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, zero waste. Front-loaded with the core action, followed immediately by critical type-selection guidance, and closes with return value disclosure. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description appropriately explains the return value (siteId). With 100% schema coverage and clear annotations, the description covers the essential complexity. Minor gap: doesn't mention prerequisite of obtaining organizationId (though schema references rybbit_list_sites).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, baseline is 3. The description adds value by semantically linking the 'type' and 'domain' parameters—explaining that 'web' corresponds to domain format and 'app' to package name format—which reinforces the schema descriptions with narrative context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the core action ('Create a new site') and the target system ('in Rybbit'). It distinguishes from analytics siblings (get_metric, list_sites) by emphasizing creation, and specifies the return value (siteId) which clarifies the tool's output purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides excellent specific guidance on selecting between 'web' and 'app' types with concrete domain vs package name examples. Mentions the return value is for 'tracking integration,' implying the setup context. Lacks explicit differentiation from update_site_config or delete_site siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/nks-hub/rybbit-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server