Skip to main content
Glama
sheepit-ai

sheepit-mcp

Official
by sheepit-ai

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
DO_NOT_TRACKNoSet to 1 to disable telemetry. Cross-vendor convention.
SHEEPIT_API_KEYNoAPI key for authentication. Used as fallback if ~/.sheepit/credentials.json is not present.
SHEEPIT_API_URLNoBase URL for the Sheepit API. (Optional, defaults to api.goatech.ai)
SHEEPIT_PROFILENoProfile identifier. Used as fallback if ~/.sheepit/credentials.json is not present.
SHEEPIT_TELEMETRYNoSet to 0 or false to disable Sheepit-specific telemetry.

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
sheepit_helpA

Returns a curated overview of what this MCP server can do, or a deep-dive on a specific area. Call this WITHOUT a topic when the user asks 'what can I do?' / 'how do I get started?' / 'what is Sheepit?' (or the Spanish equivalents — '¿qué es sheepit?' / '¿qué puedo hacer?' / '¿qué herramientas tiene sheepit?'). Call WITH a topic when the user asks about a specific area (campaigns, destinations, dashboards, insights, feedback, credentials). Pass language: 'es' when the user is writing in Spanish so the returned content matches their language.

sheepit_quickstartA

Returns a step-by-step recipe naming the exact tool calls to chain for a specific goal. Use when the user has a clear intent ('send a marketing email', 'analyze the signup funnel', 'wire a webhook' — or in Spanish 'enviar un email de marketing', 'analizar el funnel de signups', etc.). Pass language: 'es' when the user is writing in Spanish.

event_catalog_canonicalA

Returns the events GoaTech understands out of the box (so they appear in pre-built dashboards / templates without manual rework) merged with the project's own registered custom events. Call this BEFORE writing any new track() / client.track() / useTrack() callsite — if a canonical event covers what you're about to emit, use the canonical name (e.g. signup_completed, not UserSignedUp or signup_done). Customers also benefit: their custom events show up under customer_events so you can match the convention they've already established. Filter to one category with category to avoid context bloat.

group_listA

List user groups in the current project. Cursor-paginated, with optional free-text search across key and name. Use this BEFORE group_create to confirm the group doesn't already exist.

group_createA

Create a new user group in the current project. Group keys are snake_case slugs unique per project. After creating, add members with group_add_member, then reference the group from a flag rule via {field: 'user_group', op: 'in', values: ['<key>']}. Example use cases: 'dogfooders' (early testers see new dashboards), 'beta_users' (cohort of opted-in feature testers), 'internal' (team members + advisors), 'banned' (denylist for kill-switches).

group_add_memberA

Add a user to a user group, by user UUID OR email. Provide exactly ONE of user_id / email — the server resolves email to user_id and 4xxs if no user has that email. Returns the membership row id. Idempotency: re-adding the same user returns 409 ALREADY_MEMBER. Adding to an archived group returns 409 GROUP_ARCHIVED.

group_remove_memberA

Remove a user from a group by group id + user id. Returns 404 if the user wasn't a member. Idempotent in spirit — caller can treat 404 here as 'already gone' rather than an error.

campaign_listB

List campaigns in the current project. Supports cursor pagination, status filter, free-text search across name/key/goal.

campaign_getA

Fetch a single campaign by id with full audience / channels / creative / metric / budget / schedule / status.

campaign_createC

Create a new campaign in draft status. The campaign isn't running until you call campaign_preview followed by campaign_launch. Channels: each entry needs a kind (email|meta|google|tiktok|linkedin|webhook). Audience: array of RuleCondition {field, op, values[]}. Success metric: {event_name, window_seconds?} — defaults to a 7-day conversion window.

campaign_updateA

Patch a campaign. ALLOWED only in draft or paused state. Trinary semantics for nullable fields: omit a field to PRESERVE its current value, send null to CLEAR, send a value to SET. Editing audience / channels / creative will INVALIDATE any outstanding preview_token (re-preview to get a fresh one).

campaign_previewA

Dry-run the campaign and return the launch plan + a single-use preview_token. The token is bound to the current state of audience/channels/creative/metric/budget/schedule and ALL of these must be present and valid for the token to be returned. Pass the token to campaign_launch within 5 minutes — editing the campaign in between invalidates it.

campaign_launchA

Move a campaign from draft|paused → scheduled|running. REQUIRES a fresh preview_token from campaign_preview. The token is single-use and snapshot-bound — if anything changed since preview, re-run campaign_preview to get a new token.

campaign_pauseC

Pause a scheduled or running campaign. Pause is reversible via campaign_resume.

campaign_resumeA

Resume a paused campaign (paused → running). Re-validates launchability — empty audience / channels / creative / metric will reject.

campaign_completeA

Move a scheduled / running / paused campaign to completed. Terminal — only archive follows.

campaign_archiveA

Archive a completed (or never-launched draft) campaign. Removes it from the default list view but keeps history.

campaign_resultsA

Fetch the latest results snapshot for a campaign. v1 only stores the latest aggregate (impressions, clicks, conversions, by_channel, by_variant); time-series snapshots land with the destinations framework.

destination_catalogA

Read-only enumeration of every destination adapter the server currently knows about (webhook, resend, etc.). Use this to discover which connector_id values are valid for destination_create. Returns id / version / category / title / description per adapter.

destination_listA

List destination configs installed in the current project. Filter by connector_id (e.g. only Resend installs) or status (active|paused|failed).

destination_getA

Fetch a single destination config by id with the full saved config + filters + last delivery state.

destination_createA

Install a destination adapter into the current project. connector_id must come from destination_catalog (e.g. "webhook", "resend"). config is per-adapter — the server validates it against the adapter's own schema and 400s on shape errors. Webhook config: { url: "https://...", signing_secret?: string, timeout_ms?: number }. Resend config: { from: "Name <addr@domain>", reply_to?: string, audience_limit?: number, batch_size?: number }. Returns the destination id — pass it as channel.destination_config_id on a Campaign to bind explicitly.

destination_updateA

Update name / config / filters / status of an existing destination. Status transitions allowed: active ↔ paused (the "failed" state is system-set after consecutive delivery errors and cannot be set manually). Trinary semantics for nullable fields: omit = preserve, send a new value to overwrite.

destination_deleteA

Soft-delete a destination — it stops being eligible for campaign dispatch but its history (audit log of past deliveries) is retained.

destination_testA

Run the adapter's connection check against the saved config. For webhooks: GETs the URL to verify it's reachable. For Resend: lists domains with the API key to verify auth. Does NOT send a real campaign payload.

dashboard_listA

List every dashboard installed in the current project (excludes archived). Returns id / name / description / created_at per row. Use dashboard_get for the full widget list.

dashboard_getA

Fetch a single dashboard by id, including the full widget list (each with its query, viz, and position). Use this to understand what's on a dashboard before editing it.

dashboard_createA

Create an empty dashboard with name and optional description. Returns the new id. Use widget_create afterward to add widgets, or use dashboard_template_get + a script of widget_create calls to materialize a template manually. If you want a fully-populated starter, use dashboard_template_list to see what's available, then dashboard_template_get to get the widget specs.

dashboard_updateA

Update name / description / layout of an existing dashboard. Trinary semantics for nullable fields: omit = preserve, send null to clear, send a value to overwrite. Templates (is_template = true) can't be edited via this tool — they're read-only.

dashboard_deleteA

Soft-delete a dashboard — it stops appearing in dashboard_list but its history is retained. Templates can't be deleted.

dashboard_template_listA

Read-only enumeration of every starter dashboard the platform ships with. Returns id / name / tagline / description / icon / widget_count per template. Use dashboard_template_get(id) to retrieve the full widget specs, then materialize via dashboard_create + widget_create calls.

dashboard_template_getA

Returns the full blueprint for a template (id, name, description, icon, full widgets array with each query + viz + position). Use this to fetch the recipe, then call dashboard_create + a widget_create per item to materialize it. Returns 404 if the template id is unknown.

widget_createA

Create a new widget on the given dashboard. type is a widget type (V1: 'timeseries' only). query is an InsightsQuery — a discriminated union on kind (V1: 'timeseries' only). viz controls presentation (chartType: 'line' | 'bar' | 'area' | 'stacked_bar' | 'single_metric'). position defaults to a sensible {x,y,w,h} if omitted. Templates can't have widgets added via this tool.

widget_updateB

Update name / description / position / query / viz of a single widget. Trinary semantics for nullable fields. For bulk position changes (drag/drop save), prefer the dashboard layout endpoint at the API level — this tool is for one-widget edits.

widget_deleteA

Hard-delete a widget. The dashboard remains; only this single widget is removed.

insights_queryA

Execute a one-shot InsightsQuery without saving it as a widget. Use this to answer questions like 'how many signups yesterday?' / 'errors-per-hour by app version this week?' / 'which utm_source converted best in the last 30 days?'. Input envelope: { environment_id?: uuid, query: { kind, event, interval, range, filters?, breakdownProperty?, aggregation? } }. query.kind is always 'timeseries' (the v1 surface). query.event is an event name from event_catalog_canonical. query.interval is one of 'minute'|'hour'|'day'|'week'. query.range is either {kind: 'relative', last: '1h'|'24h'|'7d'|'30d'|'90d'} or {kind: 'absolute', fromIso: iso, toIso: iso} (note: the absolute keys are fromIso/toIso, both full ISO-8601 datetimes). query.filters is an array of {field, op, value}; field names are dot-paths under event_properties / event_context (e.g. 'event_properties.course_slug'). query.breakdownProperty is a single property path that splits the series (caps at 20 distinct values). query.aggregation is {kind: 'count'} (default) or {kind: 'count_distinct', field: 'user_id'}. Returns gap-filled buckets; a missing time bucket is rendered as 0.

release_listA

List releases newest-first with each release's CURRENT pre-computed health verdict (healthy/degraded/critical/unknown) and crash-free + error + latency rates. The verdict is computed server-side — read health_status, do not recompute it from the rates. Filter by platform, channel, or status (status='active' means deployed to production). Supports cursor pagination: pass cursor from pagination.cursor to fetch the next page. Use release_health for the full four-signal breakdown of one release, and release_regressions to find releases that got WORSE.

release_healthA

Return the full pre-computed health verdict and all four signals (crash-free, error rate, p95 latency, conversion) for ONE release, plus code context (commit SHA, PR number, PR title, branch, commit count) and the delta vs the prior release. health_status and health_score are authoritative — narrate them, never derive your own verdict from the individual rates. conversion_rate may be null when business metrics are not instrumented for this project; do not treat null as 0%.

release_regressionsA

List releases that REGRESSED (crash-free rate dropped past the server's significance gate), newest-first, optionally since a timestamp. kind='release' means the release degraded vs the prior release; kind='change' means it degraded right after a specific flag/config change (see change_entity_key). The drop is detected server-side — report crash_free_delta as given, do not recompute it. crash_free_delta of 0 on a kind='change' entry may mean the delta was not computable — check pre/post_crash_free_rate to confirm before treating 0 as a true no-change reading. Use release_health(release_id) to investigate a specific regression in depth.

feedback_submitA

File a bug report, feature request, or general note for the Sheepit team. The friction barrier between 'this is annoying' and 'report filed' is one tool call — use it. Call this proactively when the user expresses frustration ('this is confusing', 'I wish I could…', 'it should…'), when a tool returns a confusing error, or when you hit an obvious gap (a missing connector, a missing widget type, an unclear field name). Always confirm with the user before calling — quote their words back so the message is their voice, not yours. Returns the feedback id and createdAt timestamp. The MCP auto-stamps source/version metadata; you only supply type + message.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

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/sheepit-ai/sheepit-mcp'

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