Product
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.
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.
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.
| Role | Capabilities | |
|---|---|---|
founder | All capabilities: invite, change roles, remove members, transfer ownership, access billing. | 1 per team |
admin | Invite new members, remove editors. Cannot remove other admins, access billing, or transfer ownership. | |
editor | Read and write to the team library. Cannot invite, remove, or access billing. |
Roles are enforced server-side
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.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
| Code | Meaning |
|---|---|
INVITE_ALREADY_LIVE | A pending invite for this email already exists. |
CANNOT_INVITE_FOUNDER | You cannot invite the team founder. |
NOT_AUTHORIZED_TO_INVITE | Your role does not allow sending invites. |
INVALID_INVITE_ROLE | The role you specified is not valid. |
INVITE_EXPIRED | The accept link is older than 7 days. |
INVITE_EMAIL_MISMATCH | The signed-in account does not match the invite email. |
INVITE_ALREADY_MEMBER | The invitee is already an active member. No action needed. |
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
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.
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
REST endpoint
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.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.
| Detail | Value |
|---|---|
| Billing unit | Per seat (active members) |
| Seat reconciliation | Automatic — seats adjust when members join or leave |
| Who can see billing | Founder only |
| Billing location | /team/billing in the Team section |
| Personal Pro status | Coexists with Team — not replaced by team membership |
Personal Pro and Team coexist
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.
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_prompts | Returns personal prompts and team prompts in one list. Each row includes a scope marker. |
list_agents | Returns personal agents and team agents in one list. Each row includes a scope marker. |
list_skills | Returns personal skills and team skills in one list. Each row includes a scope marker. |
get_prompt | Fetches a prompt you own personally OR that belongs to one of your team orgs. |
get_agent | Fetches an agent you own personally OR that belongs to one of your team orgs. |
get_skill | Fetches a skill you own personally OR that belongs to one of your team orgs. |
Every row in a union response carries a scope field so the AI knows which workspace an item came from.
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.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.Manage members at /team/members. The actions available depend on your role.
| Action | Who can do it |
|---|---|
| Invite a new member | Founder, Admin |
| Change a member's role | Founder only |
| Remove an editor | Founder, Admin |
| Remove an admin | Founder only |
| Transfer org ownership | Founder only |
| Leave the org | Any member (except the founder) |
Seat reconciliation is automatic
I invited someone but the Team workspace is empty
Invite link shows INVITE_EXPIRED
/team/members and send a fresh one. The invitee can use the new link immediately.Invite link shows INVITE_EMAIL_MISMATCH
I can't see the Personal | Team switcher
NOT_ORG_MEMBER when sharing via the API
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'
/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