Rize MCP Server
The Rize MCP server lets AI assistants like Claude and ChatGPT read and write your Rize data — time entries, clients, projects, and tasks — directly from the chat window. It speaks the Model Context Protocol, so any MCP-compatible client can connect.
Rize MCP is listed in the major MCP directories including Claude's MCP directory and the Official MCP Registry.
Quickstart
- Add the connector. In Claude Desktop: Settings → Connectors → Add custom connector. Paste
https://mcp.rize.io/mcpas the URL. - Authorize. Claude opens a browser to sign in to Rize. Sign in, review the requested permissions, and approve.
- Try a prompt. Ask Claude "How much time did I track today?" or "Show me my pending time entry suggestions."
That's it. Claude now has 23 tools to read and write your Rize data.
Connection
| Setting | Value |
|---|---|
| Server URL | https://mcp.rize.io/mcp |
| Transport | Streamable HTTP |
| Authentication | OAuth 2.0 (authorization code + PKCE) |
| Discovery metadata | https://mcp.rize.io/.well-known/oauth-authorization-server |
Dynamic client registration is supported — clients that follow RFC 7591 (Claude Desktop, Claude Code, Cursor, Zed, etc.) register themselves automatically the first time you connect.
Authentication
The server uses OAuth 2.0 authorization code flow with PKCE. Here's what happens on first connection:
- Your MCP client asks the server for a client registration.
- The client opens your browser to
https://app.rize.io/oauth/mcp/signinto authenticate you. - You sign in with "Continue with Google" or magic link — the same way you sign in to Rize normally.
- Rize shows a consent screen listing what the AI assistant will be able to read and write.
- After you approve, the browser redirects back to your MCP client with an authorization code.
- Your MCP client exchanges the code for an access token and uses it on every request.
Access tokens expire after 2 hours. Refresh tokens are long-lived, so you'll only need to re-authorize if you explicitly disconnect or revoke access from Rize's account settings.
Scopes
| Scope | What the assistant can do |
|---|---|
read | List and read your time entries, clients, projects, tasks, and team membership. |
write | Create, update, and delete the above within your workspace. Approve or reject AI-generated time entry suggestions. |
The server operates entirely within your own Rize workspace. It cannot access other users' data.
Setup per client
Claude Desktop / Claude.ai
- Open Settings → Connectors.
- Click Add custom connector.
- Enter:
- Name:
Rize - URL:
https://mcp.rize.io/mcp
- Name:
- Click Add. The Rize connector appears in your connector list.
- Click Connect next to Rize. A browser window opens.
- Sign in with Continue with Google or your Rize magic link, then approve the permissions.
- Return to Claude — the Rize tools are now available in any chat.
Claude Code
-
Register the server:
claude mcp add --transport http rize https://mcp.rize.io/mcpOr drop a
.mcp.jsonin your project root:{
"mcpServers": {
"rize": {
"type": "http",
"url": "https://mcp.rize.io/mcp"
}
}
} -
Start (or restart) a Claude Code session so it picks up the new server.
-
Run
/mcp— you'll see rize listed with status Needs authentication. -
Select rize and choose Authenticate. A browser window opens.
-
Sign in with Continue with Google or your Rize magic link, then approve. The page will say Authorization successful — you can close it.
-
Back in Claude Code, run
/mcpagain to confirm rize is connected. The Rize tools are now ready to use.
Codex (OpenAI)
Add Rize to your project's .mcp.json:
{
"mcpServers": {
"rize": {
"type": "url",
"url": "https://mcp.rize.io/mcp"
}
}
}
Run codex and authenticate when prompted. Rize tools are available immediately after authorization.
ChatGPT
- Open Settings → Apps.
- Search for Rize or click Add App.
- Enter the MCP server URL:
https://mcp.rize.io/mcp - Authorize with Continue with Google or your Rize magic link, then approve.
- You'll land back in ChatGPT with the Rize connector attached and ready to use in any chat.
Gemini CLI
Add Rize to your Gemini CLI settings.json (either the global ~/.gemini/settings.json or the project-scoped .gemini/settings.json):
{
"mcpServers": {
"rize": {
"httpUrl": "https://mcp.rize.io/mcp"
}
}
}
Start gemini in your project and Gemini will open a browser window for the OAuth flow the first time a Rize tool is called. For the latest Gemini MCP configuration options, see the Gemini CLI docs.
Zed
Zed currently runs MCP servers as stdio child processes and doesn't speak remote HTTP directly. Use the mcp-remote adapter to bridge the two in ~/.config/zed/settings.json:
{
"context_servers": {
"rize": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://mcp.rize.io/mcp"],
"env": {}
}
}
}
mcp-remote opens a browser for OAuth on first run and caches the token locally.
Any other MCP client
Any client that speaks the Model Context Protocol and supports Streamable HTTP with OAuth 2.0 can connect directly. This includes Cursor, Continue, and anything built on the official MCP SDKs. Clients that only support stdio (like Zed today) can bridge via mcp-remote — see the Zed example above.
Point the client at https://mcp.rize.io/mcp — OAuth (including dynamic client registration) is negotiated automatically. A typical config entry looks like:
{
"mcpServers": {
"rize": {
"url": "https://mcp.rize.io/mcp"
}
}
}
If your client doesn't support OAuth discovery yet, check its documentation for how to add a remote MCP server — most use some variant of the snippet above. The exact key names (url, httpUrl, transport, etc.) differ per client.
Tools overview
The server exposes 24 tools. Jump to Tool reference for parameters and return shapes.
Time entries
| Tool | Purpose |
|---|---|
list_my_time_entries | Your time entries for a date range. |
list_team_time_entries | All team members' entries (admin only). |
get_time_entry | Full details of one entry by ID. |
create_time_entry | Log a new entry. |
update_time_entry | Edit times, title, entity assignments, or billing. |
delete_time_entry | Remove an entry. |
AI suggestions
| Tool | Purpose |
|---|---|
generate_time_entries | Ask the AI to fill in entries for a date range based on your tracked activity. |
regenerate_time_entry | Re-run generation on a pending or failed entry, optionally with custom guidance. |
approve_time_entries | Accept pending AI suggestions, optionally assigning a client/project/task. |
reject_time_entries | Dismiss pending AI suggestions. |
approve_tag_suggestion | Accept an AI-suggested client/project/task tag on an entry. |
Analytics
| Tool | Purpose |
|---|---|
get_my_time_allocation | Your hours grouped by client, project, or task. |
get_team_time_allocation | Team-wide allocation (admin only). |
list_my_apps_used | Your app and website usage for a date range. |
Clients
| Tool | Purpose |
|---|---|
list_clients | List clients and their hourly rates. |
create_client | Add a new client. |
update_client | Edit a client's name, rate, color, or status. |
Projects
| Tool | Purpose |
|---|---|
list_projects | List projects. |
create_project | Add a new project, optionally under a client. |
update_project | Edit a project's name, client, color, or status. |
Tasks
| Tool | Purpose |
|---|---|
list_tasks | List tasks. |
create_task | Add a new task, optionally under a project. |
update_task | Edit a task's name, project, assignee, color, or status. |
Team
| Tool | Purpose |
|---|---|
invite_team_member | Invite a new member by email (admin only). |
Tool reference
list_my_time_entries
List the current user's own time entries for a date range. Returns all statuses by default (active, pending, generating, failed). Sorted by start time with client/project/task details and formatted durations.
| Parameter | Type | Required | Description |
|---|---|---|---|
date | string | yes | Start date in YYYY-MM-DD format. |
end_date | string | no | End date in YYYY-MM-DD format. Defaults to date for a single-day query. |
statuses | array<enum> | no | One or more of active, pending, generating, failed, rejected. Defaults to all non-rejected. |
client_ids | array<string> | no | Filter by client IDs. |
project_ids | array<string> | no | Filter by project IDs. |
task_ids | array<string> | no | Filter by task IDs. |
team_id | string | no | Filter by team. Defaults to the user's default workspace. |
limit | number | no | Max entries (1–500, default 100). |
cursor | string | no | Pagination cursor from a previous response. |
Returns { entries, count, has_more, next_cursor }.
list_team_time_entries
List time entries across all team members (team admin only). Non-admins see only their own entries.
| Parameter | Type | Required | Description |
|---|---|---|---|
date | string | yes | Start date in YYYY-MM-DD format. |
end_date | string | no | End date. Defaults to date. |
creator_emails | array<string> | no | Filter to specific team members by email. |
creator_ids | array<string> | no | Filter by identity ID. |
statuses | array<enum> | no | See list_my_time_entries. |
client_ids | array<string> | no | Filter by client IDs. |
project_ids | array<string> | no | Filter by project IDs. |
task_ids | array<string> | no | Filter by task IDs. |
team_id | string | no | Filter by team. |
limit | number | no | Max entries (1–500, default 100). |
cursor | string | no | Pagination cursor. |
Returns { entries, count, has_more, next_cursor }.
get_time_entry
Fetch a single time entry by ID with full details including client, project, task, billing info, and AI confidence data.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The time entry ID. |
Returns the full time entry object, or { error: "NOT_FOUND" } if the ID doesn't exist.
create_time_entry
Create a new time entry with optional client, project, and task assignment. Times must be in ISO 8601 format — convert user-local times to their timezone (available as _user_timezone in every response) before sending.
| Parameter | Type | Required | Description |
|---|---|---|---|
start_time | string | yes | ISO 8601 start time (e.g. 2024-01-15T09:00:00Z). |
end_time | string | yes | ISO 8601 end time. |
title | string | no | Title for the entry. |
description | string | no | Description of work performed. |
client_id | string | no | Client to assign. |
project_id | string | no | Project to assign. |
task_id | string | no | Task to assign. |
team_id | string | no | Team. Defaults to the user's default workspace. |
billable | boolean | no | Whether this entry is billable. |
idempotency_key | string | no | Unique key to prevent duplicate entries on retry. Recommended for all creates. |
Returns the created time entry object.
Example
{
"start_time": "2024-01-15T14:00:00-05:00",
"end_time": "2024-01-15T15:30:00-05:00",
"title": "Client review meeting",
"client_id": "42",
"project_id": "187",
"billable": true,
"idempotency_key": "meeting-2024-01-15-acme"
}
update_time_entry
Update an existing time entry. Supports changing times, title, description, billing, and entity reassignment. Changing team_id clears entity assignments.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The time entry ID to update. |
start_time | string | no | New ISO 8601 start time. |
end_time | string | no | New ISO 8601 end time. |
title | string | no | New title. |
description | string | no | New description. |
client_id | string | no | Reassign to this client. |
project_id | string | no | Reassign to this project. |
task_id | string | no | Reassign to this task. |
team_id | string | no | Move to this team (clears entity assignments). |
billable | boolean | no | Set billable status. |
Returns the updated time entry object.
delete_time_entry
Delete a time entry by ID. Works on entries of any status.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The time entry ID to delete. |
Returns the deleted time entry object.
generate_time_entries
Generate AI time entries for a date range. Analyzes your tracked apps, websites, and meetings, then clusters them into multiple entries based on natural activity groups. Skips time slots where previous entries were rejected unless retry_rejected is set.
| Parameter | Type | Required | Description |
|---|---|---|---|
start_time | string | yes | ISO 8601 start time. |
end_time | string | yes | ISO 8601 end time. |
team_id | string | no | Team. Defaults to the user's default workspace. |
retry_rejected | boolean | no | If true, also generate entries in time slots that were previously rejected. Default false. |
Returns { entries, count, note }. Generation is asynchronous — poll list_my_time_entries with statuses: ["pending", "generating"] to check status.
Rate limit: 15 calls per minute.
regenerate_time_entry
Regenerate AI content for a pending or failed time entry. Useful when generation failed or you want a better title/description. Optionally provide custom instructions.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The time entry ID to regenerate. |
instructions | string | no | Custom instructions to guide the AI (e.g. "focus on the meeting with Client X"). |
Returns the updated time entry object with a note about async completion.
Rate limit: max 3 regenerations per entry, 15 calls per minute.
approve_time_entries
Approve pending AI-generated time entry suggestions, making them active. Optionally assign client/project/task during approval in one operation.
| Parameter | Type | Required | Description |
|---|---|---|---|
ids | array<string> | yes | Time entry IDs to approve (at least one). |
client_id | string | no | Assign this client to all approved entries. |
project_id | string | no | Assign this project to all approved entries. |
task_id | string | no | Assign this task to all approved entries. |
Returns { approved, count }.
reject_time_entries
Reject pending AI-generated time entry suggestions. Rejected entries are kept in the database but hidden from active views.
| Parameter | Type | Required | Description |
|---|---|---|---|
ids | array<string> | yes | Time entry IDs to reject. |
Returns { rejected, count }.
approve_tag_suggestion
Approve an AI-suggested client, project, or task tag on a time entry. Tag suggestions appear on pending entries as inline recommendations with confidence scores.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The tag suggestion ID to approve. |
Returns { id, tag_type, tag_id, tag_name, status, confidence_score, reasoning }.
list_my_apps_used
List the apps and websites the current user has used during a date range. Returns app names, URLs, window titles, and usage durations. This tool is useful for AI assistants that want to understand what work was done during a time period without relying solely on time entry descriptions.
| Parameter | Type | Required | Description |
|---|---|---|---|
date | string | yes | Start date in YYYY-MM-DD format. |
end_date | string | no | End date. Defaults to date. |
team_id | string | no | Filter by team. |
Returns { apps, count } where each app includes name, total duration, and usage details.
get_my_time_allocation
Get the current user's own time allocation summary grouped by client, project, or task.
| Parameter | Type | Required | Description |
|---|---|---|---|
date | string | yes | Start date in YYYY-MM-DD format. |
end_date | string | no | End date. Defaults to date. |
group_by | enum | no | One of client, project, task. Default client. |
client_ids | array<string> | no | Filter by client IDs. |
project_ids | array<string> | no | Filter by project IDs. |
task_ids | array<string> | no | Filter by task IDs. |
team_id | string | no | Filter by team. |
statuses | array<enum> | no | Default ["active"]. |
Returns total hours, billable hours, and a breakdown by grouping.
get_team_time_allocation
Get time allocation summary across all team members (team admin only). Same parameters as get_my_time_allocation, plus:
| Parameter | Type | Required | Description |
|---|---|---|---|
creator_emails | array<string> | no | Filter to specific team members by email. |
creator_ids | array<string> | no | Filter by identity ID. |
list_clients
List clients with their hourly rates and team associations.
| Parameter | Type | Required | Description |
|---|---|---|---|
statuses | array<string> | no | Default ["active"]. |
limit | number | no | Max clients (1–100, default 50). |
cursor | string | no | Pagination cursor. |
Returns { clients, count, has_more, next_cursor }.
create_client
Create a new client. Clients are top-level entities that projects and time entries can attach to.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Client name. |
hourly_rate | number | no | Default hourly rate for billing. |
color | string | no | Color hex (e.g. #FF5733). |
team_name | string | no | Team to associate with. Defaults to the user's default team. |
Returns the created client.
update_client
Update a client's name, hourly rate, color, or status.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The client ID. |
name | string | no | New name. |
hourly_rate | number | no | New hourly rate. |
color | string | no | New color hex. |
status | string | no | New status (e.g. active, archived). |
Returns the updated client.
list_projects
List projects with their client associations.
| Parameter | Type | Required | Description |
|---|---|---|---|
client_id | string | no | Filter by client ID. |
statuses | array<string> | no | Default ["in_progress", "completed"]. |
limit | number | no | Max projects (1–100, default 50). |
cursor | string | no | Pagination cursor. |
Returns { projects, count, has_more, next_cursor }.
create_project
Create a new project, optionally under a client.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Project name. |
client_id | string | no | Existing client ID to associate with. |
client_name | string | no | Client name — creates the client if it doesn't exist. |
color | string | no | Color hex. |
team_name | string | no | Team. Defaults to the user's default team. |
Returns the created project.
update_project
Update a project's name, client, color, or status.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The project ID. |
name | string | no | New name. |
client_id | string | no | New client ID. |
client_name | string | no | New client name (creates if missing). |
color | string | no | New color hex. |
status | string | no | New status (e.g. in_progress, completed, archived). |
Returns the updated project.
list_tasks
List tasks with their project and assignee associations.
| Parameter | Type | Required | Description |
|---|---|---|---|
statuses | array<string> | no | Default ["in_progress", "completed"]. |
limit | number | no | Max tasks (1–100, default 50). |
cursor | string | no | Pagination cursor. |
Returns { tasks, count, has_more, next_cursor }.
create_task
Create a new task, optionally under a project. Tasks are the finest-grained unit of work and can be assigned to team members.
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | yes | Task name. |
project_id | string | no | Existing project ID. |
project_name | string | no | Project name — creates the project if missing. |
assignee_email | string | no | Team member email. Defaults to the authenticated user. |
color | string | no | Color hex. |
team_name | string | no | Team. Defaults to the user's default team. |
Returns the created task.
update_task
Update a task's name, project, assignee, color, or status.
| Parameter | Type | Required | Description |
|---|---|---|---|
id | string | yes | The task ID. |
name | string | no | New name. |
project_id | string | no | New project ID. |
project_name | string | no | New project name (creates if missing). |
assignee_email | string | no | New assignee email. |
color | string | no | New color hex. |
status | string | no | New status. |
Returns the updated task.
invite_team_member
Invite a new member to a team by email. Sends an invitation email. Requires team admin permissions. Naturally idempotent — re-inviting an existing member returns the existing record.
| Parameter | Type | Required | Description |
|---|---|---|---|
team_id | string | yes | Team ID. |
email | string | yes | Email of the person to invite. |
name | string | no | Name of the person being invited. |
role | enum | no | One of member, admin. Default member. |
Returns the created or existing team member.
Rate limits
- 100 requests per minute per user across all tools.
generate_time_entries: 15 requests per minute (tighter because each call spawns an AI job).regenerate_time_entry: 15 requests per minute, with a max of 3 regenerations per entry.
Exceeding a limit returns a RATE_LIMITED error with a retry_after_seconds hint so your assistant knows exactly when to try again.
Error handling
All tool errors return a JSON object with an error field. Assistants should surface the message and retry where appropriate.
| Code | Meaning | How an assistant should react |
|---|---|---|
AUTHENTICATION_ERROR | Token missing, expired, or invalid. | Prompt the user to re-authorize the connector. |
AUTHORIZATION_ERROR | User lacks permission (e.g. non-admin calling a team-wide tool). | Explain the permission gap; don't retry. |
RATE_LIMITED | Rate limit hit. | Wait retry_after_seconds, then retry. |
VALIDATION_ERROR | One or more inputs failed server-side validation. | Show messages to the user and correct them. |
NOT_FOUND | The requested record doesn't exist or isn't visible. | Don't retry; ask the user for a valid ID. |
SUBSCRIPTION_ERROR | Workspace plan doesn't allow this action. | Surface the billing message; don't retry. |
HTTP_5xx / INTERNAL_ERROR | Transient server error. | Retry once; if it repeats, surface the message. |
Troubleshooting
"Not authenticated" on every call — Your token expired or was revoked. Open the connector settings and sign in again.
OAuth browser opens but doesn't redirect back — Some browsers block automatic redirects to localhost. Try completing the flow in Chrome or Edge.
generate_time_entries returns no entries — Rize only generates entries from tracked activity. If the desktop app wasn't running during the target range, or the range is too short (under 30 minutes), generation may produce nothing. Try a full workday.
"Admin only" errors on team tools — list_team_time_entries, get_team_time_allocation, and invite_team_member require team admin. Use the _my_ variants instead, or ask an admin.
Stale tool list after update — Claude Desktop occasionally caches the tool list. Fully quit and relaunch the app, then re-open a chat.
Example prompts
- "How much time did I track today?"
- "Show me my pending suggestions and approve them."
- "What's my time allocation this week grouped by project?"
- "Create a time entry from 9am to 10am titled 'Team standup'."
Support
- Website: rize.io
- Contact: rize.io/contact
- Privacy policy: rize.io/privacy-policy
- Terms of service: rize.io/terms-of-service