Portamora
Discover atmospheric 3D worlds, read controls, and build and publish authorized environments.
Should I use this
Quality & Safety
Findings (3)
- HIGH
- MEDIUMin list_comments
- INFOin list_comments
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"mcp": {
"url": "https://portamora.app/mcp"
}
}
}Remote endpoints
https://portamora.app/mcpstreamable-httpWhat it can do
Tool inventory
Tools (8)
🟢search_worlds(q, sort, days, tag, creator, ...)
Browse and search published worlds. Sort by newest, liked, or trending. The days filter accepts 1, 7 (API default), or 30 UTC calendar days including today, or all for any sort. Newest filters publication date unless days=all or creator is specified. Liked ranks period likes, or lifetime likes when days=all. Trending ranks period activity, or lifetime plays and likes when days=all, with publication-age decay in both cases. Older worlds may appear in activity rankings. The Explore website defaults to liked/all; API defaults remain newest/7. Search text can include exact #tags; custom tags are supported without a fixed vocabulary. Liked and trending require the community flag. Follow nextCursor with unchanged filters until null. Drafts and offline worlds are excluded. Public; no authentication is required.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"default": ""
},
"sort": {
"type": "string",
"enum": [
"newest",
"liked",
"trending"
],
"default": "newest"
},
"days": {
"type": [
"integer",
"string"
],
"enum": [
1,
7,
30,
"all"
],
"default": 7
},
"tag": {
"type": "string",
"pattern": "^\\s*#?[A-Za-z0-9][A-Za-z0-9_-]{0,31}\\s*$",
"description": "One to 32 tag characters; optional leading #, surrounding whitespace, and uppercase letters are normalized."
},
"creator": {
"type": "string",
"minLength": 3,
"maxLength": 30,
"pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])$",
"description": "An existing creator handle; lookup ignores case."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"default": 24
},
"cursor": {
"type": "string",
"maxLength": 1024
}
},
"required": [],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"data": {
"type": "object",
"properties": {
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 16,
"maxLength": 16,
"pattern": "^world_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive world identifier with 10 safe-alphabet characters after the prefix."
},
"title": {
"type": "string"
},
"tagline": {
"type": "string"
},
"description": {
"type": "string"
},
"tags": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 32,
"pattern": "^[a-z0-9][a-z0-9_-]*$"
}
},
"currentVersionId": {
"anyOf": [
{
"type": "string",
"minLength": 18,
"maxLength": 18,
"pattern": "^version_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive version identifier with 10 safe-alphabet characters after the prefix."
},
{
"type": "null"
}
]
},
"publishedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
{
"type": "null"
}
]
},
"playsTotal": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"likesTotal": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"dislikesTotal": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"links": {
"type": "object",
"properties": {
"self": {
"type": "string",
"format": "uri"
},
"details": {
"type": "string",
"format": "uri"
},
"play": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"thumbnail": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
}
},
"required": [
"self",
"details",
"play",
"thumbnail"
],
"additionalProperties": false
},
"creator": {
"type": "object",
"properties": {
"handle": {
"type": "string",
"minLength": 3,
"maxLength": 30,
"pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])$"
},
"displayName": {
"type": "string"
},
"links": {
"type": "object",
"properties": {
"profile": {
"type": "string",
"format": "uri"
}
},
"required": [
"profile"
],
"additionalProperties": false
}
},
"required": [
"handle",
"displayName",
"links"
],
"additionalProperties": false
}
},
"required": [
"id",
"title",
"tagline",
"description",
"tags",
"currentVersionId",
"publishedAt",
"playsTotal",
"likesTotal",
"dislikesTotal",
"links",
"creator"
],
"additionalProperties": false
}
},
"nextCursor": {
"type": [
"string",
"null"
]
}
},
"required": [
"items",
"nextCursor"
],
"additionalProperties": false
}
},
"required": [
"status",
"data"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_world(worldId)
Read a public world page. Offline and removed worlds retain a notice; drafts are not exposed.
Input Schema
{
"type": "object",
"properties": {
"worldId": {
"type": "string",
"minLength": 16,
"maxLength": 16,
"pattern": "^world_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive world identifier with 10 safe-alphabet characters after the prefix."
}
},
"required": [
"worldId"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 16,
"maxLength": 16,
"pattern": "^world_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive world identifier with 10 safe-alphabet characters after the prefix."
},
"title": {
"type": "string"
},
"tagline": {
"type": "string"
},
"description": {
"type": "string"
},
"thumbnailKey": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"enum": [
"published",
"offline",
"removed"
]
},
"currentVersionId": {
"anyOf": [
{
"type": "string",
"minLength": 18,
"maxLength": 18,
"pattern": "^version_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive version identifier with 10 safe-alphabet characters after the prefix."
},
{
"type": "null"
}
]
},
"publishedAt": {
"anyOf": [
{
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
{
"type": "null"
}
]
},
"playsTotal": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"likesTotal": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"dislikesTotal": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"bytesUnpacked": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
{
"type": "null"
}
]
},
"tags": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 32,
"pattern": "^[a-z0-9][a-z0-9_-]*$"
}
},
"creator": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 15,
"maxLength": 15,
"pattern": "^user_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive user identifier with 10 safe-alphabet characters after the prefix."
},
"handle": {
"type": "string",
"minLength": 3,
"maxLength": 30,
"pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])$"
},
"displayName": {
"type": "string"
},
"bio": {
"type": "string"
},
"avatarKey": {
"type": [
"string",
"null"
]
},
"links": {
"type": "object",
"properties": {
"self": {
"type": "string",
"format": "uri"
},
"profile": {
"type": "string",
"format": "uri"
},
"avatar": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
}
},
"required": [
"self",
"profile",
"avatar"
],
"additionalProperties": false
}
},
"required": [
"id",
"handle",
"displayName",
"bio",
"avatarKey",
"links"
],
"additionalProperties": false
},
"links": {
"type": "object",
"properties": {
"self": {
"type": "string",
"format": "uri"
},
"details": {
"type": "string",
"format": "uri"
},
"play": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
},
"thumbnail": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
}
},
"required": [
"self",
"details",
"play",
"thumbnail"
],
"additionalProperties": false
}
},
"required": [
"id",
"title",
"tagline",
"description",
"thumbnailKey",
"status",
"currentVersionId",
"publishedAt",
"playsTotal",
"likesTotal",
"dislikesTotal",
"bytesUnpacked",
"tags",
"creator",
"links"
],
"additionalProperties": false
}
},
"required": [
"status",
"data"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_version(versionId)
Read the current ready version of a published world. Unpublished versions are not exposed.
Input Schema
{
"type": "object",
"properties": {
"versionId": {
"type": "string",
"minLength": 18,
"maxLength": 18,
"pattern": "^version_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive version identifier with 10 safe-alphabet characters after the prefix."
}
},
"required": [
"versionId"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 18,
"maxLength": 18,
"pattern": "^version_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive version identifier with 10 safe-alphabet characters after the prefix."
},
"worldId": {
"type": "string",
"minLength": 16,
"maxLength": 16,
"pattern": "^world_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive world identifier with 10 safe-alphabet characters after the prefix."
},
"versionNumber": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"sdkVersion": {
"type": "number",
"const": 1
},
"bytesUnpacked": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"notes": {
"type": [
"string",
"null"
]
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
},
"packagePath": {
"type": "string"
},
"controls": {
"default": null,
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string",
"pattern": "^(Key[A-Z]|Digit[0-9]|ArrowUp|ArrowDown|ArrowLeft|ArrowRight|Space|ShiftLeft|ShiftRight|Mouse)$"
},
"additionalProperties": {
"type": "string",
"minLength": 1,
"maxLength": 160
}
},
{
"type": "null"
}
]
},
"links": {
"type": "object",
"properties": {
"self": {
"type": "string",
"format": "uri"
},
"world": {
"type": "string",
"format": "uri"
},
"play": {
"type": "string",
"format": "uri"
},
"entry": {
"type": "string",
"format": "uri"
}
},
"required": [
"self",
"world",
"play",
"entry"
],
"additionalProperties": false
}
},
"required": [
"id",
"worldId",
"versionNumber",
"sdkVersion",
"bytesUnpacked",
"notes",
"createdAt",
"packagePath",
"controls",
"links"
],
"additionalProperties": false
}
},
"required": [
"status",
"data"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_creator(handle)
Read an active creator profile. Email addresses, roles and account state are never exposed.
Input Schema
{
"type": "object",
"properties": {
"handle": {
"type": "string",
"minLength": 3,
"maxLength": 30,
"pattern": "^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])$",
"description": "An existing creator handle; lookup ignores case."
}
},
"required": [
"handle"
],
"additionalProperties": false
}Output Schema
{
"type": "object",
"properties": {
"status": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"data": {
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 15,
"maxLength": 15,
"pattern": "^user_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive user identifier with 10 safe-alphabet characters after the prefix."
},
"handle": {
"type": "string",
"minLength": 3,
"maxLength": 30,
"pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])$"
},
"displayName": {
"type": "string"
},
"bio": {
"type": "string"
},
"avatarKey": {
"type": [
"string",
"null"
]
},
"links": {
"type": "object",
"properties": {
"self": {
"type": "string",
"format": "uri"
},
"profile": {
"type": "string",
"format": "uri"
},
"avatar": {
"anyOf": [
{
"type": "string",
"format": "uri"
},
{
"type": "null"
}
]
}
},
"required": [
"self",
"profile",
"avatar"
],
"additionalProperties": false
}
},
"required": [
"id",
"handle",
"displayName",
"bio",
"avatarKey",
"links"
],
"additionalProperties": false
}
},
"required": [
"status",
"data"
],
"$schema": "https://json-schema.org/draft/2020-12/schema",
"additionalProperties": false
}🟢get_community
Read server-evaluated community and play-counting flags. Personal state is returned by me.get. Lists use cursor pagination.
Input Schema
{
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}🟢list_comments(worldId, limit, cursor)
Read plain-text comments, newest first, with deletion placeholders. Viewer controls are private; no-store. Lists use cursor pagination.
Input Schema
{
"type": "object",
"properties": {
"worldId": {
"type": "string",
"minLength": 16,
"maxLength": 16,
"pattern": "^world_[6789BCDFGHJKLMNPQRTWbcdfghjkmnpqrtwz]{10}$",
"description": "Case-sensitive world identifier with 10 safe-alphabet characters after the prefix."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 60,
"default": 24
},
"cursor": {
"type": "string",
"maxLength": 1024
}
},
"required": [
"worldId"
],
"additionalProperties": false
}🟢read_guide(guide)
Read an official Portamora guide, policy, agent discovery file, or OpenAPI specification. Start with worlds before building and workflows before uploading.
Input Schema
{
"type": "object",
"properties": {
"guide": {
"type": "string",
"enum": [
"agents",
"worlds",
"api",
"workflows",
"mcp",
"terms",
"privacy",
"discovery",
"openapi"
]
}
},
"required": [
"guide"
],
"additionalProperties": false
}🟢get_starter
Get the editable starter ZIP and the build guide. Download and build it in your own workspace; the MCP server does not execute world code.
Input Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}Recommended Prompts
search_worldssearch_worldsget_worldget_worldlist_commentsCommunity
Evidence