Portamora

Discover atmospheric 3D worlds, read controls, and build and publish authorized environments.

Should I use this

Quality & Safety

A
Description quality
93%
Schema completeness
75%
Naming quality
100%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool 'list_comments' description contains placeholder textin list_comments
  • INFOTool description contains placeholder or incomplete textin list_comments

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,854Tokens (tool definitions)
~4.1 KBTypical response size
Significant attention impact (3.01% of 128k context)

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-http

What it can do

Tool inventory

Tools (8)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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_research
Search for information about [topic] using Portamora
Expected tools: search_worlds
find_specific
Find [specific item] using Portamora
Expected tools: search_worlds
retrieve_data
Get details about [item] from Portamora
Expected tools: get_world
fetch_info
Fetch [information type] using Portamora
Expected tools: get_world
list_items
List all [items] available in Portamora
Expected tools: list_comments

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded8 tools