First-party app
Circle

Circle

Manage members, spaces, posts, comments, events and tags in a Circle community via the Circle Admin API v2.

stable CommunicationSocial Media

About

Circle ships in the w6w first-party pack. It declares 33 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.circle
Version
0.1.2
Author
w6w
Licence
MIT
Categories
Communication · Social Media

Overview

Circle is a community platform — spaces, courses, events, and paywalled memberships — and this app manages it through Circle’s own Admin API v2, the surface Circle itself recommends over its older v1.

It covers the operational core of running a community: members (list, get, search, invite, update, deactivate, ban), spaces and space membership, posts and comments, and events with attendee management. Tags let a workflow segment members, message-create sends a direct message or starts a group chat, and a general search reaches across spaces and posts at once.

Good for automating member onboarding — inviting someone and assigning them to spaces, groups and tags in one call — keeping community membership in sync with a CRM, publishing content or announcements from another system, and managing event attendees fed by an external registration form.

Build with Circle

Three routes to the same 33 actions. The Workflow tab is generated from Circle's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

Create Comment

comment-create

Comment on a post, or reply to another comment. Authored by the token's owner — this endpoint has no author override.

Delete Comment

comment-delete

Delete one comment. Circle may refuse with a 422 as well as 404 — its message is surfaced verbatim.

List Comments

comment-list

Page through comments, optionally narrowed to one post, one space, or a text match. Replies are returned flat, keyed by `parent_comment_id`.

Get Community

community-get

Fetch the community this connection's token belongs to, with its settings. Takes no parameters — the token identifies the community.

Add Event Attendee

event-attendee-add

RSVP a member to an event by email address.

List Event Attendees

event-attendee-list

Page through an event's RSVPs. Records carry the attendee's name, email and RSVP date, but not their member id.

Remove Event Attendee

event-attendee-remove

Cancel a member's RSVP to an event.

Get Event

event-get

Fetch one event by numeric id, with its schedule, location and host.

List Events

event-list

Page through events, optionally narrowed to one event space or a date window.

Ban Member

member-ban

DESTRUCTIVE — deletes the member's posts, comments, likes and chat messages, then bans their email and IP addresses. There is no unban endpoint.

Deactivate Member

member-deactivate

Deactivate a community member. Circle names this route 'deactivate' — their posts and comments stay. Use `member-ban` to remove content as well.

Get Member

member-get

Fetch one community member by their community-member id.

Invite Member

member-invite

Create a community member by email, optionally adding them to spaces and tagging them in the same call.

List Members

member-list

Page through the community roster, optionally filtered by status or member tags.

Find Member by Email

member-search

Look up a single community member by email address. 404s if there is no match.

List Member Tags

member-tag-list

Page through the community's member tags. The source of the tag ids the member and tagging actions need.

Update Member

member-update

Edit a member's profile fields, spaces or tags. Association lists REPLACE.

Send Message

message-create

Send a direct message to one member, or open a group chat with several. Bodies are TipTap documents; plain text is wrapped for you.

Create Post

post-create

Publish a post into a Posts-type space, authored by any member.

Delete Post

post-delete

Permanently delete a post and its comments. Circle publishes no restore route.

Get Post

post-get

Fetch one basic post, including both its TipTap document and its rendered body.

List Posts

post-list

Page through basic posts, optionally narrowed to a space, a space group, a status or a text match.

Update Post

post-update

Edit a post's title, body or settings. Only the fields you supply are touched; a supplied body replaces the whole document.

Search Community

search

Query Circle's own search index across posts, comments, members, spaces, lessons and events. Narrow by type for a uniform result shape.

Create Space

space-create

Create a space. The type is fixed at creation and decides what content it holds.

Get Space

space-get

Fetch one space by numeric id, with its full settings.

List Space Groups

space-group-list

Page through the community's space groups. The source of the `space_group_id` that `space-create` requires.

List Spaces

space-list

Page through the community's spaces. The source of the numeric space ids every other action needs.

Add Member to Space

space-member-add

Add one member to one space by email address. Additive — their other spaces are untouched.

List Space Members

space-member-list

Page through the members of one space, with their membership settings.

Remove Member from Space

space-member-remove

Remove one member from one space by email address. Their other spaces and their community membership are untouched.

Tag Member

tagged-member-add

Apply one member tag to one member. Additive — unlike `member-update`, which replaces the member's whole tag list.

Untag Member

tagged-member-remove

Remove one member tag from one member. The tag itself, and every other member holding it, is untouched.

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying Circle's real ids.

{
  "manifestVersion": "2",
  "name": "circle-example",
  "steps": [
    {
      "id": "comment-create",
      "uses": {
        "app": "io.w6w.circle",
        "action": "comment-create",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "postId": "<postId>",
        "body": "<body>"
      }
    }
  ]
}

Here are some of the things you can do

  • Create Comment

    perform
    comment-create
  • List Comments

    search
    comment-list
  • Get Community

    read
    community-get
  • Add Event Attendee

    perform
    event-attendee-add
  • List Event Attendees

    search
    event-attendee-list

+28 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for Circle, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to Circle. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "post-create",
  payload: {
    spaceId: "<value>",
    name: "<value>",
    // text: "<value>",
    // bodyJson: "<value>",
    // status: "<value>",
    // publishedAt: "<value>",
    // authorEmail: "<value>",
    // slug: "<value>",
    // topics: "<value>",
    // isPinned: "<value>",
    // skipNotifications: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action post-create --payload '{"spaceId":"<value>","name":"<value>"}'

Give an AI agent Circle — without giving it Circle's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.circle#comment-create",
    "input": {
      "postId": "<postId>",
      "body": "<body>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's Circle connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

Circle's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. Circle itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

Circle declares its own checks, so its health is a property of the app rather than something the host guesses at.

service

Circle platform status

Atlassian Statuspage summary for status.circle.so. The verdict tracks the Developer API component group — the REST API this app calls — rather than Circle's global indicator, which also aggregates the mobile apps and the help centre. All components are reported.

quota

API quota headroom