Ramifica
Collaborative nested-list outliner with OAuth-backed MCP tools for reading, creating, updating, checking off, and reorganizing live Ramifica lists.
What it can do
- Get Lists: Use this tool to retrieve all lists belonging to the authenticated Ramifica user. Call this before any write operation to discover valid list names and IDs. Returns an array of list objects
- Get Items: Use this tool to retrieve all items in a specific Ramifica list. Requires listId — obtain this from get_lists first. Returns items with their hierarchical structure. Each item includes: - i
- Add Items: Use this tool to add one or more items to a Ramifica list. Call this tool when you have content to store in Ramifica — outlines, lists, notes, plans. Items are specified as a flat array. Ea
What data it sees
Do you need an account
No: the server works without sign-in
Collaborative nested-list outliner with OAuth-backed MCP tools for reading, creating, updating, checking off, and reorganizing live Ramifica lists.
How to connect
How to connect Ramifica to Claude
The server address to paste into Claude settings:
https://ramifica--rapidlyproductive.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect Ramifica to ChatGPT
The server address to paste into ChatGPT settings:
https://ramifica--rapidlyproductive.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect Ramifica to Cursor
The server address to paste into Cursor settings:
https://ramifica--rapidlyproductive.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
Server tool list (9)
Raw names from tools/list. Only developers need these.
| get_lists | Use this tool to retrieve all lists belonging to the authenticated Ramifica user. Call this before any write operation to discover valid list names and IDs. Returns an array of list objects. Each object includes: - id: the Convex ID string — use this as the listId argument in get_items - name: the human-readable list name - itemCount: number of items currently in the list (0 for empty lists) - createdAt / updatedAt: Unix timestamps in milliseconds - isShared: true if this list was shared with the user by another user Example output: [ { "id": "jd7abc123", "name": "Inbox", "itemCount": 5, "createdAt": 1711234567000, "updatedAt": 1711234599000, "isShared": false }, { "id": "jd7def456", "name": "Project Alpha", "itemCount": 12, "createdAt": 1710000000000, "updatedAt": 1711200000000, "isShared": true } ] |
| get_items | Use this tool to retrieve all items in a specific Ramifica list. Requires listId — obtain this from get_lists first. Returns items with their hierarchical structure. Each item includes: - id: Convex ID string for the item - content: the text content of the item - parentId: ID of the parent item, or null if this is a top-level item - depth: 0-based nesting level (0 = top level, 1 = child, 2 = grandchild, etc.) - order: fractional index string used for ordering among siblings - isChecked: boolean — true if the item is checked off / completed (defaults to false); use this to triage open vs done items - checkedAt: number | null — Unix ms timestamp when the item was checked, or null if it is not checked - imageIds: string[] — ids of the item's attached images (empty array [] if none); to fetch an image call get_item_image(itemId, index) where index is the position of the id in imageIds (i.e. imageIds[0] is fetched with index 0, imageIds[1] with index 1, etc.) Example input: { "listId": "jd7abc123" } Example output: [ { "id": "item1", "content": "Section 1", "parentId": null, "depth": 0, "order": "a0", "isChecked": false, "checkedAt": null, "imageIds": ["img_abc", "img_def"] }, { "id": "item2", "content": "Subsection 1.1", "parentId": "item1", "depth": 1, "order": "a0", "isChecked": true, "checkedAt": 1700000000000, "imageIds": [] } ] |
| add_items | Use this tool to add one or more items to a Ramifica list. Call this tool when you have content to store in Ramifica — outlines, lists, notes, plans. Items are specified as a flat array. Each item has: - content (required): the text of the item - depth (optional): nesting level — 0 = top-level, 1 = child, 2 = grandchild, etc. - parentIndex (optional): index of the parent item within this same items array (0-based). Takes precedence over depth. If listName is omitted, items are added to the user's Inbox list (auto-created if it does not exist). Maximum 50 items per call. Example — flat list: { "items": [{"content": "Buy milk"}, {"content": "Buy eggs"}] } Example — nested using depth: { "listName": "Project Plan", "items": [ {"content": "Phase 1", "depth": 0}, {"content": "Research", "depth": 1}, {"content": "Phase 2", "depth": 0} ]} Example — nested using parentIndex: { "items": [ {"content": "Parent item", "depth": 0}, {"content": "Child item", "depth": 1, "parentIndex": 0} ]} |
| create_list | Use this tool to create a new named list in Ramifica. Call this before add_items when you want to store content in a specific new list. Returns the new list's id — use this to verify the list was created. If the token grants access to multiple workspaces, pass an explicit workspaceId to choose where the list lives. If the token grants Personal access, omit workspaceId to create a Personal list. Example — Personal list: { "name": "Shopping List" } Example — workspace list: { "name": "Q2 Plan", "workspaceId": "ws123" } |
| update_item | Use this tool to update an existing item in a Ramifica list. Call get_items first to obtain valid item IDs. At least one of content or checked must be provided. Parameters: - itemId: the Convex ID of the item to update (get from get_items) - content (optional): new text content for the item - checked (optional): true to mark item as done, false to unmark, null/omit to leave unchanged Error codes in error responses: - NOT_FOUND: item does not exist - ACCESS_DENIED: token does not have write access to this list - INVALID_ARGS: neither content nor checked was provided Example — update content: { "itemId": "item123", "content": "Updated text" } Example — mark as done: { "itemId": "item123", "checked": true } Example — update both: { "itemId": "item123", "content": "Done task", "checked": true } |
| rename_list | Use this tool to rename a Ramifica list. Only the list owner can rename — collaborators will receive an ACCESS_DENIED error. Call get_lists first to obtain valid list IDs. Parameters: - listId: the Convex ID of the list to rename (get from get_lists) - name: the new name for the list (must be non-empty) Error codes in error responses: - NOT_FOUND: list does not exist - ACCESS_DENIED: token belongs to a collaborator, not the owner Example: { "listId": "list456", "name": "Q2 Planning" } |
| set_checked | Use this tool to toggle an item's checkbox state in a Ramifica list. Call get_items first to obtain valid item IDs. This is the canonical "mark done" / "uncheck" surface — single-purpose so the call site is unambiguous (vs update_item which also accepts a checked field but is intended for content edits). Parameters: - itemId: the Convex ID of the item to toggle (get from get_items) - checked: true to mark the item complete (stamps checkedAt = now), false to uncheck (clears checkedAt) Server semantics (mirrors the UI's toggleCheck behavior exactly): - checked: true → isChecked = true, checkedAt = <ms timestamp> - checked: false → isChecked = false, checkedAt = null Error codes in error responses: - NOT_FOUND: item does not exist - ACCESS_DENIED: token does not have access to this list Example — mark done: { "itemId": "item123", "checked": true } Example — uncheck: { "itemId": "item123", "checked": false } |
| move_item | Use this tool to reparent an item and its entire subtree within the same list. Call get_items first to obtain valid item IDs. Parameters: - itemId: the Convex ID of the item to move (get from get_items) - parent_id: Convex ID of the new parent item, or null to move the item to root level. Omit or pass null to move to root level. - after_item_id: Convex ID of the sibling to insert after. Omit to append as the last sibling. Constraints: - Same-list moves only. Cross-list moves are not supported. - Cycle prevention: an item cannot be moved under itself or any of its own descendants. - parent_id: null with no after_item_id → item becomes the last root-level item. Error codes in error responses: - NOT_FOUND: item or parent item does not exist - INVALID_ARGS: parent item belongs to a different list - CYCLE: move would create a cycle (item becoming its own ancestor) - ACCESS_DENIED: token does not have write access to this list Example — reparent under another item: { "itemId": "item123", "parent_id": "item456" } Example — move to root level: { "itemId": "item123", "parent_id": null } Example — reorder as last child of a parent: { "itemId": "item123", "parent_id": "item456", "after_item_id": "item789" } |
| get_item_image | Use this tool to retrieve the image(s) attached to an item as MCP image content blocks the model can see directly (base64-encoded with mimeType). Parameters: - itemId: Convex ID of the item whose images you want. Get from get_items. - index: 0-based image index in upload/createdAt order. Omit to return all ready images up to the per-call cap (3). Pass 0 for the first image, 1 for the second, etc. Behavior: - No index: returns all ready images up to 3 (oldest first). If the item has more than 3 images, the first 3 are returned with a continuation note — pass index to fetch the others. - With index: returns exactly that one image (0-based, upload order). Per-image size limit: 1,500,000 bytes raw. - Explicit index on an oversized image → IMAGE_TOO_LARGE error. - Oversized image in a multi-image (no-index) result → skipped with a note; others are returned. Error codes in error responses: - NO_IMAGES: this item has no ready images - INVALID_INDEX: index out of range for this item's image count - IMAGE_TOO_LARGE: the requested image exceeds the size cap - "Item not found or access denied": item does not exist or the token lacks access |