{"name":"com.igods/space-monkey","slug":"igods-space-monkey","title":"Space Monkey Mailchimp Dashboard","description":"Mailchimp engagement intelligence for AI agents: campaign analytics and audience insights.","url":"https://mcp.market/server/igods-space-monkey","rating":null,"grade":"C","score":60,"certified":false,"status":"active","category":"email","tags":["email"],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":2,"ok":2,"last_checked_at":"2026-09-19T21:30:49.642Z","last_ok_at":"2026-09-19T21:30:49.642Z","latency_ms":503},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/CameronKnowlton/spacemonkey","website":"https://spacemonkey.igods.com","version":"1.1.0","remotes":[{"type":"streamable-http","url":"https://spacemonkey.igods.com/_api/public/v1/mcp"}],"packages":[],"tools":[{"name":"sm_get_account","description":"Introspect the API key's own account — effective tier, per-service entitlements, current hour/month quota usage and project count. Use it to check headroom or diagnose a 403/429 before retrying.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"required":[],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_campaign","description":"Load one campaign's full report — delivery, open, click, click-to-open and bounce rates plus campaign metadata. Use after you have identified a campaign of interest. Returns a fixed-size set of campaign-level aggregates in one call regardless of audience size; per-variant, funnel and geography breakdowns are on sm_get_variate, not here.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"campaignId":{"type":"string","minLength":1,"description":"The opaque string identifier for the campaign as assigned by Mailchimp. List campaigns to obtain this ID. If the ID is invalid or does not exist in the project, the endpoint will return a 404 error."}},"required":["projectId","campaignId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_insights_advanced","description":"Get deeper audience analytics for a project: engagement distribution, tag and segment summaries, subscriber-growth baseline with churn decomposition, and campaign consistency. Use when basic insights cannot explain a change. Excludes the per-campaign performance table, single-campaign detail, list overview and the engagement and send-volume trends — use sm_get_insights_basic for those. Excludes campaign fatigue, subject-line keywords, send-time heatmap, monthly trend and audience health — use sm_get_insights_expert. All three insight tiers also return campaign averages, previous-period averages, audience summary and auto-generated insights.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"startDate":{"type":"string","description":"Inclusive ISO-8601 calendar date (UTC) lower bound for the time range in YYYY-MM-DD format. Omit to leave the start of the time window unbounded."},"endDate":{"type":"string","description":"Inclusive ISO-8601 calendar date (UTC) upper bound for the time range in YYYY-MM-DD format. Omit to leave the end of the time window unbounded or use the endpoint's default."},"campaignId":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"The opaque string identifier for the campaign as assigned by Mailchimp. List campaigns to obtain this ID. If the ID is invalid or does not exist in the project, the endpoint will return a 404 error."},"minSendVolume":{"type":"integer","minimum":0,"description":"Minimum number of emails sent to include a campaign in the insights aggregations. Omit to use the system default threshold."},"maxSendVolume":{"type":"integer","minimum":0,"description":"Maximum number of emails sent to include a campaign in the insights aggregations. Omit to impose no upper bound."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_insights_basic","description":"Get headline campaign and audience performance for a project: per-campaign performance table, single-campaign detail, list overview, engagement and send-volume trends, subscriber-growth series, and period-over-period averages. Start here for \"how are we doing\". Excludes engagement distribution, tag and segment summaries, growth baseline/churn decomposition and campaign consistency — use sm_get_insights_advanced for those. Excludes campaign fatigue, subject-line keywords, send-time heatmap, monthly trend and audience health — use sm_get_insights_expert. For the member-composition view (status, rating, rep and language counts) use sm_get_member_overview, and for signup cohorts, churn and retention use sm_get_member_growth; the list overview and subscriber-growth series here are Mailchimp-list and audience-trend views, not member-level lifecycle. All three insight tiers also return campaign averages, previous-period averages, audience summary and auto-generated insights.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"campaignSortBy":{"type":"string","enum":["subject_line","send_time","emails_sent","open_rate","click_rate"],"default":"send_time","description":"The field used to order the campaigns table within the insights payload. Defaults to sorting by send time."},"campaignSortDirection":{"type":"string","enum":["asc","desc"],"default":"desc","description":"The direction to sort the campaigns table within the insights payload. Can be 'asc' for ascending or 'desc' for descending. Defaults to \"desc\" when omitted."},"startDate":{"type":"string","description":"Inclusive ISO-8601 calendar date (UTC) lower bound for the time range in YYYY-MM-DD format. Omit to leave the start of the time window unbounded."},"endDate":{"type":"string","description":"Inclusive ISO-8601 calendar date (UTC) upper bound for the time range in YYYY-MM-DD format. Omit to leave the end of the time window unbounded or use the endpoint's default."},"campaignId":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"The opaque string identifier for the campaign as assigned by Mailchimp. List campaigns to obtain this ID. If the ID is invalid or does not exist in the project, the endpoint will return a 404 error."},"minSendVolume":{"type":"integer","minimum":0,"description":"Minimum number of emails sent to include a campaign in the insights aggregations. Omit to use the system default threshold."},"maxSendVolume":{"type":"integer","minimum":0,"description":"Maximum number of emails sent to include a campaign in the insights aggregations. Omit to impose no upper bound."},"search":{"type":"string","maxLength":200,"description":"Filter the campaigns table section by a case-insensitive partial match on text or subject line. Note: this does not narrow the aggregate stats."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_insights_expert","description":"Get expert diagnostics explaining why performance is moving: campaign fatigue, subject-line keywords, timezone-aware send-time heatmap, monthly trend and audience health, plus engagement distribution and campaign consistency (also available from sm_get_insights_advanced). Use only after basic or advanced have established what changed. Excludes the per-campaign performance table, single-campaign detail, list overview and the engagement and send-volume trends — use sm_get_insights_basic. Excludes tag and segment summaries and the subscriber-growth series and baselines — use sm_get_insights_advanced. All three insight tiers also return campaign averages, previous-period averages, audience summary and auto-generated insights.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"startDate":{"type":"string","description":"Inclusive ISO-8601 calendar date (UTC) lower bound for the time range in YYYY-MM-DD format. Omit to leave the start of the time window unbounded."},"endDate":{"type":"string","description":"Inclusive ISO-8601 calendar date (UTC) upper bound for the time range in YYYY-MM-DD format. Omit to leave the end of the time window unbounded or use the endpoint's default."},"heatmapTimezone":{"type":"string","description":"The valid IANA timezone string (e.g. 'America/New_York') used to align the send-time heatmap distribution. Omit to use UTC."},"campaignId":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"The opaque string identifier for the campaign as assigned by Mailchimp. List campaigns to obtain this ID. If the ID is invalid or does not exist in the project, the endpoint will return a 404 error."},"minSendVolume":{"type":"integer","minimum":0,"description":"Minimum number of emails sent to include a campaign in the insights aggregations. Omit to use the system default threshold."},"maxSendVolume":{"type":"integer","minimum":0,"description":"Maximum number of emails sent to include a campaign in the insights aggregations. Omit to impose no upper bound."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_knowledge","description":"Returns Space Monkey's MCP knowledge documents (analyst preamble, metric guardrails, live OpenAPI schema URL) as tool output for clients that cannot read MCP resources — read this before interpreting any Space Monkey metrics.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"topic":{"type":"string","enum":["analyst-preamble","metric-guardrails","openapi"],"description":"Optional short topic selector to fetch a single knowledge document (one of: analyst-preamble, metric-guardrails, openapi). Omit this parameter to receive every knowledge document."}},"required":[],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_member","description":"Load one member's full profile — title, company, tags, clicked URLs, engagement percentile, at-risk state and bot detection. Use for pre-call briefs and to enrich a shortlist.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"subscriberHash":{"type":"string","pattern":"^[0-9a-f]{32}$","description":"The member's Mailchimp-style lowercase MD5 subscriber hash (canonical member key)."}},"required":["projectId","subscriberHash"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_member_campaigns","description":"List the individual campaigns one member received, opened or clicked. This email-level drill-down is often empty even for highly engaged members, so always keep a fallback. For the inverse view — the members who responded to one campaign — use sm_list_campaign_responders.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"subscriberHash":{"type":"string","pattern":"^[0-9a-f]{32}$","description":"The member's Mailchimp-style lowercase MD5 subscriber hash (canonical member key)."},"pageSize":{"type":"number","minimum":1,"maximum":100,"default":100,"description":"Maximum number of rows to return per page. Omit to use the default page size of 100. MCP tool calls are capped at 100 rows per page to protect the model's context window."},"cursor":{"type":"string","description":"Opaque keyset pagination cursor returned as `nextCursor` by the previous page. Must be replayed with identical query filters."},"sortBy":{"type":"string","enum":["subject_line","send_time","did_open","did_click","first_open_minutes","first_click_minutes","campaign_open_rate","campaign_click_rate"],"default":"send_time","description":"The field used to order the member campaigns list. Defaults to the send time of the campaign."},"sortDir":{"type":"string","enum":["asc","desc"],"default":"desc","description":"The direction to sort the campaign results. Can be 'asc' for ascending or 'desc' for descending. Defaults to \"desc\" when omitted."},"subjectFilter":{"type":"string","description":"Filter the timeline by a case-insensitive partial match on the campaign subject line. Omit to include all subjects."},"openedFilter":{"type":"string","enum":["all","opened","not_opened"],"default":"all","description":"Filter timeline events to only those where the campaign was opened, not opened, or 'all' to ignore open status. Defaults to \"all\" when omitted."},"clickedFilter":{"type":"string","enum":["all","clicked","not_clicked"],"default":"all","description":"Filter timeline events to only those where the campaign was clicked, not clicked, or 'all' to ignore click status. Defaults to \"all\" when omitted."},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive ISO-8601 calendar date (UTC) lower bound for the time range in YYYY-MM-DD format. Omit to leave the start of the time window unbounded."},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive ISO-8601 calendar date (UTC) upper bound for the time range in YYYY-MM-DD format. Omit to leave the end of the time window unbounded or use the endpoint's default."},"maxTimeToOpen":{"type":"number","minimum":0,"description":"Maximum elapsed time from the campaign send until the member's first open, in minutes. Omit to impose no upper bound."},"minTimeToOpen":{"type":"number","minimum":0,"description":"Minimum elapsed time from the campaign send until the member's first open, in minutes. Omit to impose no lower bound."},"maxTimeToClick":{"type":"number","minimum":0,"description":"Maximum elapsed time from the campaign send until the member's first click, in minutes. Omit to impose no upper bound."},"minTimeToClick":{"type":"number","minimum":0,"description":"Minimum elapsed time from the campaign send until the member's first click, in minutes. Omit to impose no lower bound."}},"required":["projectId","subscriberHash"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_member_geo","description":"Get the country and region distribution of a project's members. Use for territory, event and travel-planning questions. Country is inferred from the member's region where possible (US states and Canadian provinces map to US and CA) before falling back to stored country data, with unresolvable values bucketed as Unknown; regions stays null unless countryCode is passed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"countryCode":{"type":"string","description":"Two-letter ISO country code to drill into, matched case-insensitively (e.g. 'US', 'CA'). Omit it and `regions` comes back null while `countries` and `allRegions` still cover the whole audience; pass it and `regions` returns that country's region breakdown."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_member_growth","description":"Get signup cohorts, churn timeline and cohort retention. Use for list-growth and attrition questions. A cohortRetention row is the current status breakdown of members who signed up in that month, not retention at month N after signup; signup month falls back to last-changed or sync time when Mailchimp has no opt-in timestamp. For the audience size trend over time — subscriber counts bucketed by status month over month — use the subscriber-growth series in sm_get_insights_basic; this returns signup cohorts, churn and retention rather than a status trend.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_member_overview","description":"Get aggregate audience composition for a project — totals plus status, rating, rep and language breakdowns. Use for a quick shape-of-the-list answer. Not paginated: totals and the status and rating breakdowns cover every member, but the language list is truncated to the top 20 and the rep and custom-dimension lists to the top 25, and the rep block is absent unless the project maps an owner merge field. For Mailchimp-list health — per-audience sizes, unsubscribe and cleaned counts, open and click rates — use the list overview in sm_get_insights_basic; this tool is the member-composition view (status, rating, rep, language) instead.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_member_segments","description":"Get tags and segments with their engagement and status breakdowns. Use to turn an event or interest tag into a working audience. Every tag and segment is returned in one unpaginated call, but untagged members are excluded from the tag list and surface only as a separate untaggedCount, and tag engagement rates exclude insiders while tag member counts do not.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_member_timeline","description":"Replay one member's raw activity events in time order. Use to establish when someone last paid attention and what triggered it.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"subscriberHash":{"type":"string","pattern":"^[0-9a-f]{32}$","description":"The member's Mailchimp-style lowercase MD5 subscriber hash (canonical member key)."},"pageSize":{"type":"number","minimum":1,"maximum":100,"default":100,"description":"Maximum number of rows to return per page. Omit to use the default page size of 100. MCP tool calls are capped at 100 rows per page to protect the model's context window."},"cursor":{"type":"string","description":"Opaque keyset pagination cursor returned as `nextCursor` by the previous page. Must be replayed with identical query filters."},"sortBy":{"type":"string","enum":["timestamp","activity_type","campaign_title"],"default":"timestamp","description":"The field used to order the timeline. Defaults to ordering by the most recent timestamp first."},"sortDir":{"type":"string","enum":["asc","desc"],"default":"desc","description":"The direction to sort the timeline results. Can be 'asc' for ascending or 'desc' for descending. Defaults to \"desc\" when omitted."},"subjectFilter":{"type":"string","description":"Filter the timeline by a case-insensitive partial match on the campaign subject line. Omit to include all subjects."},"openedFilter":{"type":"string","enum":["all","opened","not_opened"],"default":"all","description":"Filter timeline events to only those where the campaign was opened, not opened, or 'all' to ignore open status. Defaults to \"all\" when omitted."},"clickedFilter":{"type":"string","enum":["all","clicked","not_clicked"],"default":"all","description":"Filter timeline events to only those where the campaign was clicked, not clicked, or 'all' to ignore click status. Defaults to \"all\" when omitted."},"dateFrom":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive ISO-8601 calendar date (UTC) lower bound for the time range in YYYY-MM-DD format. Omit to leave the start of the time window unbounded."},"dateTo":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive ISO-8601 calendar date (UTC) upper bound for the time range in YYYY-MM-DD format. Omit to leave the end of the time window unbounded or use the endpoint's default."},"maxTimeToOpen":{"type":"number","minimum":0,"description":"Maximum elapsed time from the campaign send until the member's first open, in minutes. Omit to impose no upper bound."},"minTimeToOpen":{"type":"number","minimum":0,"description":"Minimum elapsed time from the campaign send until the member's first open, in minutes. Omit to impose no lower bound."},"maxTimeToClick":{"type":"number","minimum":0,"description":"Maximum elapsed time from the campaign send until the member's first click, in minutes. Omit to impose no upper bound."},"minTimeToClick":{"type":"number","minimum":0,"description":"Minimum elapsed time from the campaign send until the member's first click, in minutes. Omit to impose no lower bound."}},"required":["projectId","subscriberHash"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_prompt","description":"Render one Space Monkey prompt workflow with concrete argument values, returning the complete instruction text ready to follow, plus the effective arguments that were bound (provided values plus defaults for omitted optionals). Prompt names and their arguments come from sm_list_prompts. If the rendered text still contains {{tokens}} such as {{projectId}} or {{company}}, a required argument was not provided; call again with it filled. The rendered text references sm_ tools by name; call them as instructed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Prompt name from sm_list_prompts, e.g. sm_brief_before_call."},"arguments":{"type":"object","additionalProperties":{"type":"string"},"description":"Argument values for the prompt, keyed by argument name (e.g. {\"company\": \"Conversion Sciences\", \"email\": \"brian@example.com\"}). Omit optional arguments to use their defaults. Multi-line values are supported."}},"required":["name"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_schema","description":"Get the Enterprise API's OpenAPI-derived schema catalog. Omitting `operation` returns a compact index of every Enterprise API operation; passing a tool name, full path, or path suffix returns that one operation's full parameters and resolved response schemas. Use before calling an unfamiliar tool to confirm its exact fields.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"operation":{"type":"string","description":"Optional selector for one Enterprise API operation. Omit this parameter to receive a compact index of every Enterprise API operation. Pass a tool name (e.g. sm_list_leaders), a full path (e.g. /_api/public/v1/enterprise/members/detail), or a path suffix (e.g. members/detail) to receive that operation's full parameters and resolved response schemas."}},"required":[],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_sync_run","description":"Load one sync run's full detail — per-stage results, progress, lookback window and pending batch count. Use after sm_list_sync_runs to explain why data is stale or a run failed. Failure detail lands in one of two places and rarely both: orchestration failures set run.errorMessage with no stage rows, while per-data-type failures leave it null and record the message on results[].errorMessage, so check both and treat status as the failure signal.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"runId":{"type":"string","description":"The opaque 8-character hash ID correlating to the sync run."}},"required":["projectId","runId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_get_variate","description":"Analyse a variate (A/B) campaign — per-variant reports, statistical significance, engagement velocity, audience quality and geo split. Only meaningful for multivariate campaigns. All metrics come from synced BigQuery tables rather than a live Mailchimp read, so they are only as current as the project's last sync run, whose cadence is per-project: manual, daily or weekly.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"campaignId":{"type":"string","pattern":"^[a-zA-Z0-9_-]+$","description":"The opaque string identifier for the campaign as assigned by Mailchimp. List campaigns to obtain this ID. If the ID is invalid or does not exist in the project, the endpoint will return a 404 error."}},"required":["projectId","campaignId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_list_at_risk","description":"Find previously engaged members whose recent activity has collapsed, for building save lists. Note its engagementScore is a raw decayed score that can be negative, unlike the leaders percentile.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"search":{"type":"string","description":"Filter subscribers by a case-insensitive partial match on their email address, first name, or last name. Omit to skip text filtering."},"minRating":{"type":"integer","minimum":1,"maximum":5,"description":"Minimum Mailchimp member star rating to include, from 1 to 5. Omit to include every rating."},"maxRating":{"type":"integer","minimum":1,"maximum":5,"description":"Maximum Mailchimp member star rating to include, from 1 to 5. Omit to include every rating."},"minPrior":{"type":"number","minimum":0,"description":"Minimum count of engagement actions prior to the recent drop-off. Omit to impose no lower bound."},"maxPrior":{"type":"number","minimum":0,"description":"Maximum count of engagement actions prior to the recent drop-off. Omit to impose no upper bound."},"rep":{"type":"string","description":"Filter by an exact match on the assigned sales representative's name. Omit to include members assigned to any rep."},"botFilter":{"type":"string","enum":["all","suspected-bot","clean"],"default":"all","description":"Filter out members whose interactions appear to be automated bot activity. Select 'suspected-bot' for only bots, 'clean' to exclude bots, or 'all' to ignore. Defaults to \"all\" when omitted."},"insiderFilter":{"type":"string","enum":["all","exclude","only"],"default":"all","description":"Filter out members with internal company email domains or recognized insider addresses. Select 'exclude' to hide them, 'only' to show only them, or 'all' to ignore. Defaults to \"all\" when omitted."},"sortBy":{"type":"string","enum":["active_actions_recent","active_actions_prior","email_address","member_rating"],"default":"active_actions_recent","description":"The field used to order the at-risk subscribers list. Defaults to the number of recent active actions."},"sortDir":{"type":"string","enum":["asc","desc"],"default":"asc","description":"The direction to sort the at-risk results. Can be 'asc' for ascending or 'desc' for descending. Defaults to \"asc\" when omitted."},"cursor":{"type":"string","description":"Opaque keyset pagination cursor returned as `nextCursor` by the previous page. Must be replayed with identical query filters."},"pageSize":{"type":"number","minimum":1,"maximum":100,"default":100,"description":"Maximum number of rows to return per page. Omit to use the default page size of 100. MCP tool calls are capped at 100 rows per page to protect the model's context window."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_list_campaign_responders","description":"List the members who registered a tracked response to one campaign — opened, clicked, bounced or unsubscribed — never the full send list; emailsSent is echoed so the unenumerated majority stays visible as a denominator. Narrow with action (clicked-only is usually a fraction of responders), engagementType, variant, rating or score filters; subscriberHash is the MD5 of the downcased email and joins to member-centric tools. For the campaign's own report use sm_get_campaign, for member-to-campaign history use sm_get_member_campaigns (the inverse view), and for the whole directory use sm_list_members. Results are paginated with an opaque keyset cursor valid for 24 hours and pageSize capped at 100 rows.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"campaignId":{"type":"string","minLength":1,"description":"The opaque string identifier for the campaign as assigned by Mailchimp. List campaigns to obtain this ID. If the ID is invalid or does not exist in the project, the endpoint will return a 404 error."},"action":{"type":"string","enum":["all","opened","clicked","bounced","unsubscribed"],"default":"all","description":"Narrow rows to one tracked response: all (default), opened, clicked, bounced or unsubscribed. action=clicked asks whether a member ever clicked, regardless of anything else they did. Clicked-only is usually a fraction of the responder set, so use it before paging through everything."},"engagementType":{"type":"string","enum":["all","open","click"],"default":"all","description":"Grade each responder by their highest engagement: click if clickCount is above zero, otherwise open; all (default) applies no grading. Where action=clicked asks whether a member ever clicked, engagementType=open asks whether clicking was their highest form of engagement — the two filters answer different questions."},"variant":{"type":"string","description":"Filter responders by an exact match on the campaign variant label (e.g. 'A', 'B', or 'Campaign' for non-variate campaigns). Omit to include responders across all variants."},"search":{"type":"string","description":"Filter responders by a case-insensitive partial match on email address, first name, or last name. Omit to skip text filtering."},"botFilter":{"type":"string","enum":["all","suspected-bot","clean"],"default":"all","description":"Filter out responders whose interactions appear to be automated bot activity. Select 'suspected-bot' for only bots, 'clean' to exclude bots, or 'all' (default) to ignore."},"insiderFilter":{"type":"string","enum":["all","exclude","only"],"default":"all","description":"Filter out responders with internal company email domains or recognized insider addresses. Select 'exclude' to hide them, 'only' to show only them. Defaults to 'all', which applies no insider filtering."},"minOpens":{"type":"integer","minimum":0,"description":"Minimum number of opens (open_count) required to include the responder in results. Omit for no minimum."},"maxOpens":{"type":"integer","minimum":0,"description":"Maximum number of opens (open_count) allowed to include the responder in results. Omit for no maximum."},"minClicks":{"type":"integer","minimum":0,"description":"Minimum number of clicks (click_count) required to include the responder in results. Omit for no minimum."},"maxClicks":{"type":"integer","minimum":0,"description":"Maximum number of clicks (click_count) allowed to include the responder in results. Omit for no maximum."},"minRating":{"type":"number","minimum":1,"maximum":5,"description":"Minimum Mailchimp member star rating to include, from 1 to 5. Omit to include every rating."},"maxRating":{"type":"number","minimum":1,"maximum":5,"description":"Maximum Mailchimp member star rating to include, from 1 to 5. Omit to include every rating."},"minScore":{"type":"number","minimum":0,"maximum":100,"description":"Inclusive lower bound (0-100) on the member's overall engagement percentile score (engagementScore). Identical in meaning to the leaderboard's leaderMinScore. Omit for no minimum."},"maxScore":{"type":"number","minimum":0,"maximum":100,"description":"Inclusive upper bound (0-100) on the member's overall engagement percentile score (engagementScore). Identical in meaning to the leaderboard's leaderMaxScore. Omit for no maximum."},"leader":{"type":"string","enum":["all","true","false"],"default":"all","description":"Filter responders to include only recognized leaders ('true'), exclude leaders ('false'), or ignore leader status ('all', default)."},"country":{"type":"string","description":"Filter responders by their exact two-letter ISO country code (e.g. 'US', 'GB'). Omit to include all countries."},"region":{"type":"string","description":"Filter responders by their exact region or state name as recognized by Mailchimp geography data. Omit to include all regions."},"sortBy":{"type":"string","enum":["email_address","last_name","open_count","click_count","engagement_score","member_rating","variant_label","engagement_type"],"default":"engagement_type","description":"The field used to order the responder results. Each value is the snake_case spelling of the matching response field: email_address, last_name, open_count, click_count, engagement_score, member_rating, variant_label, or engagement_type. Defaults to sorting by engagement_type."},"sortDir":{"type":"string","enum":["asc","desc"],"default":"desc","description":"The direction to sort the responder results. Can be 'asc' for ascending or 'desc' for descending. Defaults to \"desc\" when omitted."},"cursor":{"type":"string","description":"Opaque keyset pagination cursor returned as `nextCursor` by the previous page. Valid for 24 hours from issuance and bound to the exact query parameters used to generate it — it is not signed, just scoped; changing any filter, sort field, or sort direction while paginating causes the request to fail with a CURSOR_QUERY_MISMATCH error rather than silently re-scoping the results."},"pageSize":{"type":"integer","minimum":1,"maximum":100,"default":100,"description":"Maximum number of rows to return per page. Omit to use the default page size of 100. MCP tool calls are capped at 100 rows per page to protect the model's context window."}},"required":["projectId","campaignId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_list_campaigns","description":"List a project's campaigns with performance metrics. Use to map a member's lastActivityAt onto a real send, or to find the latest house send by send_time.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"search":{"type":"string","description":"Filter campaigns by a case-insensitive partial match on the subject line or specific internal campaign IDs. Omit to skip text filtering."},"startDate":{"type":"string","description":"Inclusive ISO-8601 calendar date (UTC) lower bound for the time range in YYYY-MM-DD format. Omit to leave the start of the time window unbounded."},"endDate":{"type":"string","description":"Inclusive ISO-8601 calendar date (UTC) upper bound for the time range in YYYY-MM-DD format. Omit to leave the end of the time window unbounded or use the endpoint's default."},"minSendVolume":{"type":"integer","minimum":0,"description":"Minimum number of emails sent to include the campaign in the results. Omit to use the system default threshold."},"maxSendVolume":{"type":"integer","minimum":0,"description":"Maximum number of emails sent to include the campaign in the results. Omit to impose no upper bound."},"sortBy":{"type":"string","enum":["subject_line","send_time","emails_sent","open_rate","click_rate","campaign_id"],"default":"send_time","description":"The field used to order the campaigns list. Defaults to sorting by the most recent send time first."},"sortDir":{"type":"string","enum":["asc","desc"],"default":"desc","description":"The direction to sort the campaign results. Can be 'asc' for ascending or 'desc' for descending. Defaults to \"desc\" when omitted."},"cursor":{"type":"string","description":"Opaque keyset pagination cursor returned as `nextCursor` by the previous page. Must be replayed with identical query filters."},"pageSize":{"type":"integer","minimum":1,"maximum":100,"default":100,"description":"Maximum number of rows to return per page. Omit to use the default page size of 100. MCP tool calls are capped at 100 rows per page to protect the model's context window."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_list_leaders","description":"Rank the most engaged members of a project by engagement percentile. Use when you need who is paying attention right now, filtered by rep, tag, rating, status or bot/insider rules. engagementScore is a 0-100 percentile here (at-risk tools use a raw score that can go negative), memberRating is Mailchimp's 1-5 rating, and subscriberHash is the MD5 of the member's downcased email, the join key for member-centric tools. Results are paginated with pageSize capped at 100 rows.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"search":{"type":"string","description":"Filter leaders by a case-insensitive partial match on their email address, first name, or last name. Omit to skip text filtering."},"status":{"type":"string","enum":["all","vip","non-vip","leader"],"default":"all","description":"Filter members by their specific leader status (e.g. VIP or standard leader). Select 'all' to include every status. Defaults to \"all\" when omitted."},"minScore":{"type":"number","minimum":0,"description":"Minimum engagement score percentile to include. The score ranges from 0 to 100. Omit to impose no minimum bound."},"maxScore":{"type":"number","minimum":0,"description":"Maximum engagement score percentile to include. The score ranges from 0 to 100. Omit to impose no maximum bound."},"minRating":{"type":"integer","minimum":1,"maximum":5,"description":"Minimum Mailchimp member star rating to include, from 1 to 5. Omit to include every rating."},"maxRating":{"type":"integer","minimum":1,"maximum":5,"description":"Maximum Mailchimp member star rating to include, from 1 to 5. Omit to include every rating."},"rep":{"type":"string","description":"Filter by an exact match on the assigned sales representative's name. Omit to include members assigned to any rep."},"tag":{"type":"string","description":"Filter by an exact match on a Mailchimp tag or segment name. Omit to include members with any tags."},"botFilter":{"type":"string","enum":["all","suspected-bot","clean"],"default":"all","description":"Filter out members whose interactions appear to be automated bot activity. Select 'suspected-bot' for only bots, 'clean' to exclude bots, or 'all' to ignore. Defaults to \"all\" when omitted."},"insiderFilter":{"type":"string","enum":["all","exclude","only"],"default":"all","description":"Filter out members with internal company email domains or recognized insider addresses. Select 'exclude' to hide them, 'only' to show only them, or 'all' to ignore. Defaults to \"all\" when omitted."},"leaderOnly":{"type":"boolean","default":true,"description":"Restrict the leaderboard strictly to members recognized as highly engaged leaders. Set to false to include the broader audience in the engagement rank. Defaults to true when omitted."},"sortBy":{"type":"string","enum":["engagement_score","total_opens","total_clicks","last_activity_at","is_leader","member_rating","rep_name","email_address"],"default":"engagement_score","description":"The field used to order the leaderboard results. Defaults to sorting by the highest engagement score first."},"sortDir":{"type":"string","enum":["asc","desc"],"default":"desc","description":"The direction to sort the leaderboard results. Can be 'asc' for ascending or 'desc' for descending. Defaults to \"desc\" when omitted."},"cursor":{"type":"string","description":"Opaque keyset pagination cursor returned as `nextCursor` by the previous page. Must be replayed with identical query filters."},"pageSize":{"type":"number","minimum":1,"maximum":100,"default":100,"description":"Maximum number of rows to return per page. Omit to use the default page size of 100. MCP tool calls are capped at 100 rows per page to protect the model's context window."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_list_members","description":"Browse or search a project's full member directory. Use when you need people by rating, tag, status or free-text search rather than by engagement rank.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"search":{"type":"string","description":"Filter the directory by a case-insensitive partial match on email address, first name, or last name. Omit to skip text filtering."},"status":{"type":"string","enum":["all","subscribed","unsubscribed","cleaned"],"default":"all","description":"Filter members by their current Mailchimp subscription status. Use 'subscribed', 'unsubscribed', 'cleaned', or 'all' to include everyone. Defaults to \"all\" when omitted."},"minRating":{"type":"integer","minimum":1,"maximum":5,"description":"Minimum Mailchimp member star rating to include, from 1 to 5. Omit to include every rating."},"maxRating":{"type":"integer","minimum":1,"maximum":5,"description":"Maximum Mailchimp member star rating to include, from 1 to 5. Omit to include every rating."},"leader":{"type":"string","enum":["all","true","false"],"default":"all","description":"Filter the directory to include only recognized leaders ('true'), exclude leaders ('false'), or ignore leader status ('all'). Defaults to \"all\" when omitted."},"botFilter":{"type":"string","enum":["all","suspected-bot","clean"],"default":"all","description":"Filter out members whose interactions appear to be automated bot activity. Select 'suspected-bot' for only bots, 'clean' to exclude bots, or 'all' to ignore. Defaults to \"all\" when omitted."},"insiderFilter":{"type":"string","enum":["all","exclude","only"],"default":"all","description":"Filter out members with internal company email domains or recognized insider addresses. Select 'exclude' to hide them, 'only' to show only them, or 'all' to ignore. Defaults to \"all\" when omitted."},"country":{"type":"string","description":"Filter members by their exact two-letter ISO country code (e.g. 'US', 'GB'). Omit to include all countries."},"region":{"type":"string","description":"Filter members by their exact region or state name as recognized by Mailchimp geography data. Omit to include all regions."},"tag":{"type":"string","description":"Filter by an exact match on a Mailchimp tag or segment name. Omit to include members with any tags."},"rep":{"type":"string","description":"Filter by an exact match on the assigned sales representative's name. Omit to include members assigned to any rep."},"dimensionOne":{"type":"string","description":"Filter members by an exact match on custom dimension one. Dimension values are derived from mapped Mailchimp merge fields. Omit to skip."},"dimensionTwo":{"type":"string","description":"Filter members by an exact match on custom dimension two. Dimension values are derived from mapped Mailchimp merge fields. Omit to skip."},"dimensionThree":{"type":"string","description":"Filter members by an exact match on custom dimension three. Dimension values are derived from mapped Mailchimp merge fields. Omit to skip."},"dimensionFour":{"type":"string","description":"Filter members by an exact match on custom dimension four. Dimension values are derived from mapped Mailchimp merge fields. Omit to skip."},"sortBy":{"type":"string","enum":["email","name","status","rating","leader","company","rep","tags","signup","lastChanged","lastActivity","dimension_one","dimension_two","dimension_three","dimension_four","email_address","member_rating","is_leader","company_name","rep_name","timestamp_opt","last_changed","last_activity"],"default":"email","description":"The field used to order the directory results. Defaults to sorting alphabetically by email address. The snake_case spellings matching response field names (email_address, member_rating, is_leader, company_name, rep_name, timestamp_opt, last_changed, last_activity, status, tags, dimension_one, dimension_two, dimension_three, dimension_four) are canonical. 'email', 'rating', 'leader', 'company', 'rep', 'signup', 'lastChanged', and 'lastActivity' are accepted deprecated aliases kept for backward compatibility and sort identically to their canonical equivalents. Sorting by company/company_name, rep/rep_name, or dimension_one..dimension_four falls back to ordering by email address when the corresponding merge field is unmapped. 'tags' sorts the raw underlying JSON string, not the string array returned in the response. 'name' is a composite sort across last name, first name, and company name and has no single corresponding response field."},"sortDir":{"type":"string","enum":["asc","desc"],"default":"asc","description":"The direction to sort the directory results. Can be 'asc' for ascending or 'desc' for descending. Defaults to \"asc\" when omitted."},"cursor":{"type":"string","description":"Opaque keyset pagination cursor returned as `nextCursor` by the previous page. Must be replayed with identical query filters."},"pageSize":{"type":"number","minimum":1,"maximum":100,"default":100,"description":"Maximum number of rows to return per page. Omit to use the default page size of 100. MCP tool calls are capped at 100 rows per page to protect the model's context window."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_list_projects","description":"Resolve which Space Monkey projects this API key can read. Call this first when the user names a company rather than a project ID, and match on companyName — never silently mix projects.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"required":[],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_list_prompts","description":"List the Space Monkey prompt workflows: user-invocable recipes that chain sm_ tools into this week's sales actions (build call sheets, strike after a send, save cooling leaders, harvest an event, brief before a call). Each entry lists its arguments and its category. Use sm_get_prompt to render one with concrete argument values, then follow the rendered instructions to run the workflow.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"required":[],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"sm_list_sync_runs","description":"List recent data-pipeline sync runs with status and results. Operational tool for checking data freshness before trusting an analysis. Results are paginated with pageSize capped at 100 rows.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"projectId":{"type":"string","minLength":1,"description":"Required. The opaque alphanumeric project identifier of 8 or more characters to scope this request to. Call GET /_api/public/v1/enterprise/projects to list the project IDs available to your API key. Omitting it returns 400 VALIDATION_ERROR."},"cursor":{"type":"string","description":"Opaque keyset pagination cursor returned as `nextCursor` by the previous page. Must be replayed with identical query filters."},"pageSize":{"type":"number","minimum":1,"maximum":100,"default":100,"description":"Maximum number of rows to return per page. Omit to use the default page size of 100. MCP tool calls are capped at 100 rows per page to protect the model's context window."}},"required":["projectId"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}}],"scan":{"score":60,"grade":"C","scanned_at":"2026-09-19T20:13:17.019Z","report":{"scannerVersion":"0.1.5","scannedAt":"2026-09-19T20:13:17.004Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 1399ms"]},"poisoning":{"score":15,"max":15,"notes":["25 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 1 write-action tools with no auth"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: repo not found"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://spacemonkey.igods.com/_api/public/v1/mcp","reachable":true,"authRequired":false,"latencyMs":1399,"serverInfo":{"name":"space-monkey-mcp","version":"0.1.0"}}],"packages":[],"repo":{"found":false,"owner":"CameronKnowlton","repo":"spacemonkey","error":"repo not found"},"icon":{"url":"https://spacemonkey.igods.com/_cdn/static/space-monkey-icon-192.png","source":"registry","width":192,"height":192},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}