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_project

DESTRUCTIVE

Archive 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

DestructiveIdempotentOpen world

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*string

UUID of the project to archive.

What it returns

{  "data": {    "id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",    "active": false  }}

How it fails

RESOURCE_NOT_FOUND

unknown project_id, or the project belongs to a team outside the token's scope.

TOKEN_MISSING_ABILITY

token lacks project:update.

create_project

DESTRUCTIVE

Register 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

DestructiveOpen world

A client that honours annotations asks a person before running it. It reaches beyond Subscriby: a connector, a provider or a member.

Arguments

name*string

Project name (min 5, max 255 characters).

descriptionstringoptional

Optional description. Max 1000 chars, HTML is filtered.

handlestringoptional

Optional 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.

termsstringoptional

Optional URL to the terms page. Max 255 chars.

privacystringoptional

Optional URL to the privacy page. Max 255 chars.

metricsbooleanoptional

Opt into aggregated metrics collection on this project.

activebooleanoptional

Defaults to true. Set false to create in draft state.

team_idstringoptional

Optional 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_REQUIRED

creator 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_FAILED

name too short, handle malformed / taken, or team_id is a team the token's owner does not belong to.

delete_project

DESTRUCTIVE

Permanently 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

DestructiveIdempotentOpen world

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*string

UUID 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_FOUND

unknown project_id, a project belonging to another team, one outside the

VALIDATION_FAILED

the caller is a team member whose role lacks the team's project-delete

AUTHENTICATION_REQUIRED

no authenticated user on the request.

TOKEN_MISSING_ABILITY

token lacks project:delete.

Fetch 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

Read-only

It reads and never changes anything.

Arguments

project_id*string

UUID 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_FOUND

unknown project_id, or the project belongs to a team outside the token's scope.

TOKEN_MISSING_ABILITY

token lacks project:view.

Paginated 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

Read-only

It reads and never changes anything.

Arguments

limitintegeroptional

Maximum projects to return per page (1..100).

min1max100
pageintegeroptional

1-indexed page number.

min1

What 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_ABILITY

token lacks project:view-any.

restore_project

DESTRUCTIVE

Bring 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

DestructiveIdempotentOpen world

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*string

UUID of the archived project to restore.

What it returns

{  "data": {    "id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",    "active": true  }}

How it fails

RESOURCE_NOT_FOUND

unknown project_id, a project belonging to another team, one outside the

VALIDATION_FAILED

the caller is a team member whose role lacks the team's project-update

AUTHENTICATION_REQUIRED

no authenticated user on the request.

TOKEN_MISSING_ABILITY

token lacks project:update.

update_project

DESTRUCTIVE

Apply 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

DestructiveIdempotentOpen world

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*string

UUID of the project to update.

namestringoptional

New project name (min 5, max 255 chars).

descriptionstringoptional

New description. Max 1000 chars, HTML is filtered.

handlestringoptional

New URL-friendly handle. Alpha-dash lowercase, 5-255 chars, unique. Requires Starter or Growth creator tier.

termsstringoptional

URL to the terms page. Max 255 chars.

privacystringoptional

URL to the privacy page. Max 255 chars.

metricsbooleanoptional

Toggle aggregated metrics collection.

activebooleanoptional

Flip to false to archive, true to restore.

outage_compensationsbooleanoptional

Whether 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_idstringoptional

UUID 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_FOUND

unknown project_id, or the project belongs to a team outside the token's scope.

VALIDATION_FAILED

a malformed field, or team_id is a team the token's owner does not belong to.

TOKEN_MISSING_ABILITY

token lacks project:update.

How is this guide?

On this page

Subscriby is a product designed by you — for you.No boardroom full of executives deciding what we ships next. Our roadmap always shaped by you with your feedback.

Share feedback or a request