Project Tools
A project is the container for one membership business: its plans, members, payment methods, resources and connectors.
A project is the container for one membership business: its plans, members, payment methods, resources and connectors. These tools create, read, update, archive and restore projects, the same actions the dashboard's project screens run, so an agent can set a business up or wind it down without touching anything a plan or a member owns.
Tools
archive_projectArchive ProjectDESTRUCTIVEcreate_projectCreate ProjectDESTRUCTIVEdelete_projectDelete ProjectREADget_projectGet ProjectREADlist_projectsList ProjectsDESTRUCTIVErestore_projectRestore ProjectDESTRUCTIVEupdate_projectUpdate Projectarchive_project
DESTRUCTIVEArchive a project by flipping active=false. Emits project.archived. Noop if already archived.
Archive a project — suspends new signups but preserves existing subscribers and data. Delegates to an Action so policy + cache invalidation run and project.archived fires. Noop when the project is already archived.
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Fires one event
Delivered to every endpoint subscribed to it once the change is made.
Annotations
A client that honours annotations asks a person before running it. Sending the same arguments twice changes nothing the second time. It reaches beyond Subscriby: a connector, a provider or a member.
Arguments
project_id*stringUUID of the project to archive.
What it returns
{ "data": { "id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "active": false }}How it fails
RESOURCE_NOT_FOUNDunknown project_id, or the project belongs to a team outside the token's scope.
TOKEN_MISSING_ABILITYtoken lacks project:update.
create_project
DESTRUCTIVERegister a new Subscriby project on behalf of the authenticated creator.
Scaffold a new project. Enforces the creator tier's project limit, handle uniqueness and the tier-level custom_handle capability before the row lands. A project has no platform of its own: install connectors on it afterwards with install_connector.
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Fires one event
Delivered to every endpoint subscribed to it once the change is made.
Annotations
A client that honours annotations asks a person before running it. It reaches beyond Subscriby: a connector, a provider or a member.
Arguments
name*stringProject name (min 5, max 255 characters).
descriptionstringoptionalOptional description. Max 1000 chars, HTML is filtered.
handlestringoptionalOptional URL-friendly handle. Alpha-dash lowercase, 5-255 chars. Starter or Growth tier required — Free-tier tokens get TEAM_TIER_REQUIRED if a handle is supplied.
termsstringoptionalOptional URL to the terms page. Max 255 chars.
privacystringoptionalOptional URL to the privacy page. Max 255 chars.
metricsbooleanoptionalOpt into aggregated metrics collection on this project.
activebooleanoptionalDefaults to true. Set false to create in draft state.
team_idstringoptionalOptional UUID of the owning team. Defaults to the token's scoped team.
What it returns
{ "data": { "id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "name": "Research Premium", "handle": "research-premium-abc123", "team_id": "a83f0d51-4c92-4b7e-8615-2fd9e70a3c86", "active": true, "created_at": "2026-05-18T10:05:00Z" }}How it fails
TEAM_TIER_REQUIREDcreator has hit their plan's project limit, or they passed a handle while on a tier that does not include custom_handle. Error context carries required_capability.
VALIDATION_FAILEDname too short, handle malformed / taken, or team_id is a team the token's owner does not belong to.
delete_project
DESTRUCTIVEPermanently delete a project and everything beneath it. No soft-delete, no undo — confirm the target with a human first.
Remove a project for good. Projects do not soft-delete: the row goes, and its plans, subscribers, subscriptions, resources, coupons, payment methods and support threads go with it through database cascades. The tool is for the genuinely finished project — a pilot that ran its course, a duplicate created by mistake — never for pausing sales.
Irreversible, and it takes everything with it
There is no restore for a deleted project; restore_project only reverses an
archive. Confirm the exact project_id with a human before calling. The tool
is annotated destructive so a client can prompt for confirmation.
Stopping sales is a different tool
To keep the history while turning new signups off, call
archive_project. Existing subscribers keep
their access and the project comes back with restore_project.
project.deleted emits before the row disappears, so a
webhook listener receives the final snapshot — id, name, handle, active flag and team — while those
ids still resolve. It is the last event the project will ever produce.
Idempotent in the only sense a hard delete can be: a second call on the same id finds nothing and
answers RESOURCE_NOT_FOUND, exactly as an unknown or out-of-scope id does.
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Fires one event
Delivered to every endpoint subscribed to it once the change is made.
Annotations
A client that honours annotations asks a person before running it. Sending the same arguments twice changes nothing the second time. It reaches beyond Subscriby: a connector, a provider or a member.
Arguments
project_id*stringUUID of the project to delete permanently.
What it returns
{ "data": { "id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "deleted": true }}id echoes the argument as sent; by the time the response is built there is no row left to read it
back from.
How it fails
RESOURCE_NOT_FOUNDunknown project_id, a project belonging to another team, one outside the
VALIDATION_FAILEDthe caller is a team member whose role lacks the team's project-delete
AUTHENTICATION_REQUIREDno authenticated user on the request.
TOKEN_MISSING_ABILITYtoken lacks project:delete.
get_project
READFetch a single project by UUID, including plan / resource / subscriber / payment-method counts.
Fetch full detail for one project along with its counts (plans, resources, subscribers, payment methods). Use after list_projects once you know which row to dive into.
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Annotations
It reads and never changes anything.
Arguments
project_id*stringUUID of the project to fetch.
What it returns
{ "data": { "id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "name": "Research Premium", "handle": "research-premium", "type": "telegram", "description": "Weekly deep-dive research notes.", "banner_url": "https://static.subscriby.net/...", "photo_url": "https://static.subscriby.net/...", "active": true, "team_id": "a83f0d51-4c92-4b7e-8615-2fd9e70a3c86", "counts": { "plans": 3, "resources": 2, "subscribers": 241, "payment_methods": 2 }, "created_at": "2026-05-18T10:05:00Z", "updated_at": "2026-05-18T10:05:00Z" }}How it fails
RESOURCE_NOT_FOUNDunknown project_id, or the project belongs to a team outside the token's scope.
TOKEN_MISSING_ABILITYtoken lacks project:view.
list_projects
READPaginated list of Subscriby projects visible to the current token.
Return every project the token's team can see, paginated. Use this as a starter tool — most other tools take a project_id you'll pick up from here.
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Annotations
It reads and never changes anything.
Arguments
limitintegeroptionalMaximum projects to return per page (1..100).
1max100pageintegeroptional1-indexed page number.
1What it returns
{ "data": [ { "id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "name": "Research Premium", "handle": "research-premium", "type": "telegram", "description": "Weekly deep-dive research notes.", "active": true, "created_at": "2026-05-18T10:05:00Z" } ], "meta": { "page": 1, "limit": 25, "total": 12, "has_more": false }}How it fails
TOKEN_MISSING_ABILITYtoken lacks project:view-any.
restore_project
DESTRUCTIVEBring an archived project back on sale by flipping active to true. Emits project.restored. Noop if already active.
The reverse of archive_project. Flips active back to true so
checkout, the portal and the bot accept new subscribers again. Nothing else moves: an archive never
touched subscribers, plans or history, so there is nothing to rebuild.
It runs the same Action the dashboard and the REST API use, so
project.restored fires once, when the flag actually changes.
Re-calling on a project that is already active is a no-op — the current row comes back and nothing
emits.
Archived is not deleted
An archived project resolves like any other, so its id is all you need. A
project removed with delete_project is gone for
good and answers RESOURCE_NOT_FOUND here.
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Fires one event
Delivered to every endpoint subscribed to it once the change is made.
Annotations
A client that honours annotations asks a person before running it. Sending the same arguments twice changes nothing the second time. It reaches beyond Subscriby: a connector, a provider or a member.
Arguments
project_id*stringUUID of the archived project to restore.
What it returns
{ "data": { "id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "active": true }}How it fails
RESOURCE_NOT_FOUNDunknown project_id, a project belonging to another team, one outside the
VALIDATION_FAILEDthe caller is a team member whose role lacks the team's project-update
AUTHENTICATION_REQUIREDno authenticated user on the request.
TOKEN_MISSING_ABILITYtoken lacks project:update.
update_project
DESTRUCTIVEApply a partial update to a project. Only supplied fields are touched; omitted keys stay as-is.
Apply a partial update to an existing project. Delegates to an Action so the project-service policy and cache invalidation run, and a project.updated event fires with a map of changed fields.
Requires ability
The token behind the MCP session must hold it, or the call is refused with TOKEN_MISSING_ABILITY.
Runs the same action as
The REST endpoint and this tool share one action, so validation, permissions and events are identical.
Fires one event
Delivered to every endpoint subscribed to it once the change is made.
Annotations
A client that honours annotations asks a person before running it. Sending the same arguments twice changes nothing the second time. It reaches beyond Subscriby: a connector, a provider or a member.
Arguments
project_id*stringUUID of the project to update.
namestringoptionalNew project name (min 5, max 255 chars).
descriptionstringoptionalNew description. Max 1000 chars, HTML is filtered.
handlestringoptionalNew URL-friendly handle. Alpha-dash lowercase, 5-255 chars, unique. Requires Starter or Growth creator tier.
termsstringoptionalURL to the terms page. Max 255 chars.
privacystringoptionalURL to the privacy page. Max 255 chars.
metricsbooleanoptionalToggle aggregated metrics collection.
activebooleanoptionalFlip to false to archive, true to restore.
outage_compensationsbooleanoptionalWhether members whose paid access overlapped a connector outage of an hour or more have it extended by the outage length when the connector answers again. Defaults to true on every project.
team_idstringoptionalUUID of the owning team.
What it returns
{ "data": { "id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13", "name": "Research Premium", "handle": "research-premium", "active": true }}How it fails
RESOURCE_NOT_FOUNDunknown project_id, or the project belongs to a team outside the token's scope.
VALIDATION_FAILEDa malformed field, or team_id is a team the token's owner does not belong to.
TOKEN_MISSING_ABILITYtoken lacks project:update.
How is this guide?
Plan Tools
Plans are what a project sells, and every plan has a kind that decides its shape: a subscription that renews on a cycle, a pass that sells dated windows, or a series that sells a slate of windows at once.
Resource Tools
A resource is what a plan unlocks: a place a connector gates, or a perk tracked by hand.