ParetoStudio
Documentationv2.0Start Free
Overview

Product

Library
Prompt Builder
Agent Builder
Skill Builder
Chrome Extension
Team

Developers

MCP Server
API Keys
OverviewLibraryPrompt BuilderAgent BuilderSkill BuilderChrome ExtensionTeamMCP ServerAPI Keys

Product

Team

A ParetoStudio team gives a group a shared library — prompts, agents, and skills that every member can read, install, and build on. The builders always save to your personal scope; sharing is the deliberate step that moves content into the team.

Prerequisites

Team plan

Creating an org requires a Team subscription. Members join free once invited — they do not need their own Team plan.

Founder role

The account that creates the org becomes the founder. Only the founder can invite, remove, change roles, and access billing.

Members

Each invited member needs a ParetoStudio account. They accept the invite at /accept/[token] and join immediately.

Roles

Every team member has one of three roles. Roles control what a member can do in the team workspace. The founder role is assigned at org creation and cannot be removed.

RoleCapabilities
founderAll capabilities: invite, change roles, remove members, transfer ownership, access billing.1 per team
adminInvite new members, remove editors. Cannot remove other admins, access billing, or transfer ownership.
editorRead and write to the team library. Cannot invite, remove, or access billing.

Roles are enforced server-side

The permission rules in src/rules/teamPermissions.ts are the single source of truth. Both the API routes and the UI gate on the same matrix — the UI gates are a convenience, not the authority.

Invite flow

Founders and admins send invites from /team/members. Each invite targets one email address, carries a role, and expires after 7 days.

Step 1

Compose

Enter the email address and pick a role (admin or editor). Only one live invite per email is allowed at a time.

Step 2

Review & send

Confirm the invite details. Sending fires a Resend email and generates a one-time accept link valid for 7 days.

Step 3

Accept

The invitee clicks the link at /accept/[token]. They must be signed in — the token is validated against their account email.

Copy-paste the link

The Invite drawer shows the accept link after sending. Copy it directly if the invitee did not receive the email — no resend required.

Invite error codes

CodeMeaning
INVITE_ALREADY_LIVEA pending invite for this email already exists.
CANNOT_INVITE_FOUNDERYou cannot invite the team founder.
NOT_AUTHORIZED_TO_INVITEYour role does not allow sending invites.
INVALID_INVITE_ROLEThe role you specified is not valid.
INVITE_EXPIREDThe accept link is older than 7 days.
INVITE_EMAIL_MISMATCHThe signed-in account does not match the invite email.
INVITE_ALREADY_MEMBERThe invitee is already an active member. No action needed.

Library scope

Every item you build is personal by default. Sharing is the deliberate step that moves a copy into the team library. The Personal and Team segments in the Library toolbar let you switch between the two views at any time.

Personal workspace

The default scope for all users. Items are private to you — no teammate can see them. The builders always save to your personal scope. To share an item, use the Share to team action on the item card.

Team workspace

Content visible to all active members of your org. Items here were explicitly shared from personal — they are non-destructive copies. The original personal item remains private.

Builds are always personal

The Prompt, Agent, and Skill builders save exclusively to your personal library. To populate the team library, open the item's context menu and choose Share to team. This creates a copy in the team scope — your personal original is untouched.

Workspace switcher

Team members see a Personal | Team segment control in the Library toolbar. Clicking it switches the view. The active scope persists across page reloads via localStorage.

Solo users (no team membership) never see the switcher — the Library behaves exactly as before.

Share to team

Any team member can share a personal prompt, agent, or skill to the team library. The share is non-destructive: a new copy is created in the team scope; the personal original is never modified.

How to share

  1. 1.Switch the Library to Personal.
  2. 2.Open the item card menu (three-dot or right-click) and choose Share to team.
  3. 3.If you belong to more than one org, pick the target team.
  4. 4.Confirm. The item now appears in the Team workspace for all members.

REST endpoint

Under the hood, sharing calls POST /api/prompts/[id]/share (same pattern for agents and skills) with { "orgId": "..." } in the body. The API validates org membership from the session — a non-member receives a 403 with code NOT_ORG_MEMBER.

Billing

Team billing is per seat and lives on the org, not on any individual member. Only the founder can see or manage billing at /team/billing.

DetailValue
Billing unitPer seat (active members)
Seat reconciliationAutomatic — seats adjust when members join or leave
Who can see billingFounder only
Billing location/team/billing in the Team section
Personal Pro statusCoexists with Team — not replaced by team membership

Personal Pro and Team coexist

A Team seat does not replace an individual's Pro subscription. Both run independently — a founder on Pro keeps their personal Pro benefits while the org subscription covers team seats.

MCP and teams

The MCP server sees both your personal and team content in a single union read. Team rows are annotated with a scope marker so the AI can distinguish them.

Union reads — personal ∪ team

All nine read tools pass ?union=true to the REST layer. The response includes rows from your personal scope and from every org you are an active member of, merged into one list. Solo users receive the same result as a personal-only query — zero regression.

list_promptsReturns personal prompts and team prompts in one list. Each row includes a scope marker.
list_agentsReturns personal agents and team agents in one list. Each row includes a scope marker.
list_skillsReturns personal skills and team skills in one list. Each row includes a scope marker.
get_promptFetches a prompt you own personally OR that belongs to one of your team orgs.
get_agentFetches an agent you own personally OR that belongs to one of your team orgs.
get_skillFetches a skill you own personally OR that belongs to one of your team orgs.

Per-row scope marker

Every row in a union response carries a scope field so the AI knows which workspace an item came from.

list_prompts() — example outputtext
1. **Code Review Checklist** [personal] (ID: `abc-123`)
   A structured checklist for reviewing pull requests.

2. **API Design Guide** [team: org-uuid-here] (ID: `def-456`)
   Shared team standard for RESTful API design.

3. **Incident Report Template** [personal] (ID: `ghi-789`)
   Step-by-step incident postmortem format.

Write tools still target personal scope

The create_prompt, create_agent, and create_skill tools save to your personal library. To populate the team library from the MCP server, first create the item in personal scope, then use the Share to team action in the web app. This matches the web UI behavior — builds are always personal; sharing is a deliberate step.

Install tools work on team content too

install_agent, install_skill, and install_bundle can install any item visible in a union read — including team items. Pass the item ID from the list output directly to the install tool.

Member management

Manage members at /team/members. The actions available depend on your role.

ActionWho can do it
Invite a new memberFounder, Admin
Change a member's roleFounder only
Remove an editorFounder, Admin
Remove an adminFounder only
Transfer org ownershipFounder only
Leave the orgAny member (except the founder)

Seat reconciliation is automatic

When a member joins or leaves, ParetoStudio reconciles the seat count with the Paddle subscription. The billing total updates at the next renewal cycle.

Troubleshooting

I invited someone but the Team workspace is empty

The invite creates a membership — it does not copy any content. Team members need to share items explicitly from their personal library using the Share to team action. The team library starts empty until someone shares something.

Invite link shows INVITE_EXPIRED

Invite links are valid for 7 days. Revoke the expired invite from/team/members and send a fresh one. The invitee can use the new link immediately.

Invite link shows INVITE_EMAIL_MISMATCH

The invitee is signed in with a different email than the one you invited. They must sign in with the invited address, or ask you to send a fresh invite to the address on their account.

I can't see the Personal | Team switcher

The workspace switcher only appears when your account belongs to at least one team org. If you were invited but have not yet accepted, or if you were removed from the org, the switcher is hidden and the library shows only personal content.

NOT_ORG_MEMBER when sharing via the API

The POST /api/prompts/[id]/share endpoint checks membership from the session. Log in with the account that belongs to the target org, or verify the correct orgId in the request body.

Billing tab shows 'Only the team founder can view billing'

The billing panel at /team/billing is restricted to the founder role. Admins and editors do not have access. Contact the team founder to review billing details.

MCP list_prompts only shows personal items

Verify the API key belongs to an account that is an active member of the team org and has accepted its invite. The union read requires active membership status — pending invites do not grant access.
Previous

Chrome Extension

Next

MCP Server

Back to Homepage

On this page

  • Prerequisites
  • Roles
  • Invite flow
  • Library scope
  • Share to team
  • Billing
  • MCP and teams
  • Troubleshooting