{"openapi": "3.0.3", "info": {"title": "Shared team memory for agents", "version": "1.0.0", "description": "Hosted MCP shared team memory by TextForAgents LLC. Register -> trial (first month free, up to 5 seats, once per operator) or subscribe via x402 ($5/seat/month, Base USDC) -> per-operator tokens -> JSON-RPC tools. Identity derives from the token only. Support: support@textforagents.com"}, "servers": [{"url": "https://textforagents.com/products/shared-team-agent-memory"}], "components": {"securitySchemes": {"bearerAuth": {"type": "http", "scheme": "bearer", "description": "Opaque account token (owner or operator) from /trial or /subscribe"}}, "schemas": {"RegisterRequest": {"type": "object", "required": ["account_name", "payer_wallet"], "properties": {"account_name": {"type": "string"}, "payer_wallet": {"type": "string", "description": "0x wallet that will pay via x402"}}}, "RegisterResponse": {"type": "object", "properties": {"account_id": {"type": "string"}, "claim_token": {"type": "string", "description": "Single-purpose, 24h; hash stored"}, "payment_instructions": {"type": "object"}}}, "TrialRequest": {"type": "object", "required": ["claim_token"], "properties": {"account_id": {"type": "string"}, "claim_token": {"type": "string"}}}, "TokenResponse": {"type": "object", "properties": {"account_id": {"type": "string"}, "token": {"type": "string", "description": "Shown ONCE; only its SHA-256 is stored"}, "role": {"type": "string"}, "trial": {"type": "boolean"}, "seats": {"type": "integer"}, "expires_at": {"type": "number"}}}, "SubscribeRequest": {"type": "object", "required": ["account_id", "seats"], "properties": {"account_id": {"type": "string"}, "seats": {"type": "integer", "minimum": 1}}}, "MintTokenRequest": {"type": "object", "required": ["operator"], "properties": {"operator": {"type": "string", "description": "Operator name the token will carry as its identity"}}}, "ToolArguments": {"memory_write": {"type": "object", "required": ["project", "type", "subject", "content", "author_agent", "session"], "properties": {"project": {"type": "string"}, "type": {"type": "string"}, "subject": {"type": "string"}, "content": {"type": "string"}, "author_agent": {"type": "string"}, "author_operator": {"type": "string", "deprecated": true, "description": "Deprecated - ignored: identity derives from the bearer token"}, "session": {"type": "string"}, "derived_from": {"type": "string"}}}, "memory_search": {"type": "object", "required": ["project"], "properties": {"project": {"type": "string"}, "query": {"type": "string"}, "type": {"type": "string"}}}, "memory_get": {"type": "object", "required": ["project", "id"], "properties": {"project": {"type": "string"}, "id": {"type": "string"}}}, "memory_brief": {"type": "object", "required": ["project"], "properties": {"project": {"type": "string"}}}, "memory_resolve": {"type": "object", "required": ["project", "winner_id", "loser_id"], "properties": {"project": {"type": "string"}, "winner_id": {"type": "string"}, "loser_id": {"type": "string"}, "by_operator": {"type": "string", "deprecated": true, "description": "Deprecated - ignored: identity derives from the bearer token"}}}, "memory_retract": {"type": "object", "required": ["project", "id"], "properties": {"project": {"type": "string"}, "id": {"type": "string"}, "by_operator": {"type": "string", "deprecated": true, "description": "Deprecated - ignored: identity derives from the bearer token"}}}}}}, "paths": {"/": {"get": {"summary": "Product descriptor (public)", "responses": {"200": {"description": "Descriptor JSON"}}}, "post": {"summary": "MCP JSON-RPC endpoint (initialize / ping / tools/list / tools/call)", "security": [{"bearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"type": "object", "properties": {"jsonrpc": {"type": "string"}, "id": {}, "method": {"type": "string", "enum": ["initialize", "ping", "tools/list", "tools/call", "notifications/initialized"]}, "params": {"type": "object", "description": "For tools/call: {name, arguments} \u2014 see components.schemas.ToolArguments. Identity fields (author_operator, by_operator) in arguments are ignored; identity comes from the token."}}}}}}, "responses": {"200": {"description": "JSON-RPC response"}, "401": {"description": "No/invalid/expired token; body names the register/ trial/subscribe paths"}}}}, "/health": {"get": {"summary": "Health (public)", "responses": {"200": {"description": "ok"}}}}, "/openapi.json": {"get": {"summary": "This spec (public)", "responses": {"200": {"description": "OpenAPI 3.0.3"}}}}, "/llms.txt": {"get": {"summary": "Product llms.txt (public)", "responses": {"200": {"description": "text/plain facts"}}}}, "/.well-known/x402": {"get": {"summary": "x402 payment terms for /subscribe (public)", "responses": {"200": {"description": "Payment terms"}}}}, "/register": {"post": {"summary": "Register an account (public, rate-limited)", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RegisterRequest"}}}}, "responses": {"200": {"description": "account_id + claim token + payment instructions", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RegisterResponse"}}}}, "400": {"description": "Validation error"}, "429": {"description": "Rate limited"}}}}, "/trial": {"post": {"summary": "Claim the one-time free first month (5 seats, 30 days)", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/TrialRequest"}}}}, "responses": {"200": {"description": "Owner token issued", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TokenResponse"}}}}, "400": {"description": "Bad/used/expired claim, or trial already claimed"}}}}, "/subscribe": {"post": {"summary": "Pay seats x $5 via x402 and issue/renew the owner token", "parameters": [{"name": "X-PAYMENT", "in": "header", "required": true, "description": "base64 x402 v1 payment payload (EIP-3009 transferWithAuthorization, Base USDC)", "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SubscribeRequest"}}}}, "responses": {"200": {"description": "Owner token issued/renewed", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TokenResponse"}}}}, "402": {"description": "Payment required or rejected; body carries the x402 challenge (accepts[0])"}}}}, "/tokens": {"post": {"summary": "Mint a per-operator token (owner token only; each operator token is one seat)", "security": [{"bearerAuth": []}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/MintTokenRequest"}}}}, "responses": {"200": {"description": "Operator token (shown once)"}, "400": {"description": "Seat cap reached or bad operator name"}, "401": {"description": "No valid token"}, "403": {"description": "Owner token required"}}}}, "/tokens/revoke": {"post": {"summary": "Revoke a token: owner revokes its operators ({operator} or {token_sha256}); any token revokes itself (empty body)", "security": [{"bearerAuth": []}], "responses": {"200": {"description": "Revoked"}, "401": {"description": "No valid token"}, "403": {"description": "Cannot revoke another account's token"}}}}}}