Integration

Ninety integration

Ninety runs the EOS (Entrepreneurial Operating System) for a company. Create, search, update, link and delete To-Dos, Issues and Rocks, create and update Milestones, read and write Scorecard Measurable scores and notes (up to 100 scores per call), read and post Headlines, and read Teams, Users, past and next Meetings, the V/TO and the Accountability Chart; the company-wide lists are for Owners and Admins. Every call acts as the user who created the token, with that user's in-app permissions. Authentication is a Personal Access Token from User Settings, Developer Settings in Ninety, sent as a Bearer token; the API needs the Thrive (or Legacy) plan and allows 25 requests per second per user. Ninety has no webhooks and no Milestone delete.

Ask it in chat

Say what should happen.
The workflow builds itself.

When this happens, do that in Ninety.Built from the 60 Ninety tools below, on the connection you add once.

What you can do with Ninety

Each of these is one operation on one endpoint, available both as a workflow step and as a tool an AI agent can call on its own. Nothing bundles several operations into one action, so what a run did stays readable afterwards.

Most endpoints run on the free plan. A few, mainly the ones that publish on your behalf, need a paid plan.

Todo, 7 operations

  • create_todoCreate todoPOSTCreates a To-Do on a Team (teamId) or a personal one (no teamId); userId assigns it to someone else. An Owner may assign on any Team, other roles only on their own Teams (403 otherwise). Can link a Rock, Issue or Milestone.
  • delete_todoDelete todoDELETEPermanently deletes a To-Do. This cannot be undone.
  • get_todoGet todoGETReturns one To-Do by Id with its due date, Team, owner, completion state and comments.
  • list_company_todosList company todosGETLists every non-personal To-Do across the company, by cursor: pass pagination.nextToken back as nextToken. Owners and Admins only; other roles get 403.
  • query_todosQuery todosPOSTReturns every To-Do matching the filters as one list. Team and personal To-Dos need separate calls (isPersonal); with no teamId and no userIds it returns the caller's own. query_todos_paged adds paging and totals.
  • query_todos_pagedQuery todos pagedPOSTReturns one page of To-Dos matching the filters plus totalCount; page is 1-based and pageSize at most 100. Pass sort when reading several pages so the order stays stable. Same filters as query_todos.
  • update_todoUpdate todoPATCHChanges only the fields sent on a To-Do (completed, archived, due date, Team, title, description, repeat, assignee). linkedItemId with linkedItemType also links it; a link-only call that fails changes nothing.

Issue, 6 operations

  • create_issueCreate issuePOSTCreates an Issue on a Team (title and teamId required) and returns it. Optionally assigns it to userId (same company) and links it to a To-Do, Rock or Milestone with linkedItemId plus linkedItemType.
  • delete_issueDelete issueDELETEPermanently deletes an Issue. This cannot be undone.
  • get_issueGet issueGETReturns one Issue by Id with its title, description, interval, priority, completion state and comments.
  • list_company_issuesList company issuesGETLists every non-archived, non-deleted Issue across the company, by cursor: pass pagination.nextToken back as nextToken for the next page. Owners and Admins only; other roles get 403.
  • query_issuesQuery issuesPOSTSearches the Issues the token's user can see by team, interval and text, one page at a time (pageIndex from 0, pageSize default 10). Returns items with totalCount.
  • update_issueUpdate issuePATCHChanges only the fields sent on an Issue (title, team, interval, description, priority, completed). linkedItemId with linkedItemType also links it; if the link fails the other changes may still be applied, as the message says.

Rock, 6 operations

  • create_rockCreate rockPOSTCreates a Rock owned by the token's user; teamId, title, dueDate, statusCode, levelCode and quarter are required. teamId and additionalTeamIds must come from list_available_teams. Returns a list holding the one new Rock.
  • delete_rockDelete rockDELETEDeletes a Rock as the app does (soft delete): it is flagged deleted with who and when, its linked items are cleared and it stops appearing in reads. Returns the deleted Rock.
  • get_rockGet rockGETReturns one Rock by Id with its status, level, quarter, due dates, followers, comments and Milestones.
  • list_company_rocksList company rocksGETLists every non-archived, non-deleted Rock across the company, by cursor: pass pagination.nextToken back as nextToken. Owners and Admins only; other roles get 403.
  • query_rocksQuery rocksPOSTSearches Rocks by team, owner, status, level, planning horizon and text, one flat page at a time (pageIndex from 0, pageSize up to 200, default 10), with totalCount. Prefer filtering by teamId.
  • update_rockUpdate rockPATCHChanges only the fields sent on a Rock and returns it whole. Complete it by setting statusCode DONE; userId hands it to another active user of the company, teamId must come from list_available_teams.

Measurable score, 5 operations

  • batch_set_measurable_scoresBatch set measurable scoresPOSTWrites 1 to 100 Measurable scores, overwriting existing ones. Items succeed or fail on their own and the call answers 200 either way: read summary and results[].status, and retry only the failed items.
  • delete_measurable_scoreDelete measurable scoreDELETEDeletes a Measurable's score for the period starting at periodStartDate.
  • get_measurable_scoreGet measurable scoreGETReturns one Measurable's score for the period containing date, with the period it resolved to (periodStartDate, label). value is null when nothing was recorded. Prefer it to get_team_scorecard for one number.
  • set_measurable_scoreSet measurable scorePOSTWrites a Measurable's score for the period starting at periodStartDate, overwriting any score already recorded for that period.
  • update_period_scoreUpdate period scorePATCHUpdates a Measurable's score, note or per-period goal override for the period containing periodStartDate; send at least one of value, note and goal. Fields left out stay as they are.

Milestone, 5 operations

  • create_milestoneCreate milestonePOSTCreates a Milestone on a Rock, owned by the token's user (rockId, teamId, title and dueDate required). To record one already done, send isDone true with completedDate.
  • get_milestoneGet milestoneGETReturns one Milestone by Id: its Rock, Team, owner, due date, done state and followers.
  • list_company_milestonesList company milestonesGETLists every Milestone on non-archived, non-deleted Rocks across the company, by cursor: pass pagination.nextToken back as nextToken. Owners and Admins only; other roles get 403.
  • list_rock_milestonesList rock milestonesGETReturns the Milestones of one Rock, by the Rock's Id.
  • update_milestoneUpdate milestonePATCHChanges only the fields sent on a Milestone: title, description, due date, owner, followers; set isDone true with completedDate to complete it. Milestones cannot be deleted through this API.

Meeting, 4 operations

  • get_meetingGet meetingGETReturns one past Meeting with its notes and the Headlines, Cascading Messages, Issues, To-Dos and Rocks it worked. Notes are the only free-text record of what was decided.
  • get_next_meetingGet next meetingGETReturns a Team's next scheduled Meeting with its agenda sections and the Team roster (names, emails). Only the near term is searched (about a month), so a 404 means nothing is scheduled soon.
  • list_company_meetingsList company meetingsGETLists past Meetings across every Team, newest first, one meetingType per call (default level10, the Weekly Meeting), each with its teamId. Owners and Admins only; others get 403. Use get_meeting for notes.
  • list_meetingsList meetingsGETLists a Team's past Meetings, newest first, one meetingType per call (default level10, the Weekly Meeting), with ratings, duration, attendee count and Issues solved. No notes: use get_meeting for those.

Headline, 3 operations

  • create_headlineCreate headlinePOSTCreates a Headline on one Team (or a Cascading Message with isCascadedMessage true) and notifies its followers, exactly as one created in the app. Owned by the token's user unless userId names someone in the same company.
  • list_company_headlinesList company headlinesGETLists Headlines across every Team in the company, page by page (pageIndex from 0), with the same discussed, archived and Cascading Message filters as list_headlines. Owners and Admins only; other roles get 403.
  • list_headlinesList headlinesGETLists one Team's Headlines (good or bad news raised in Meetings), page by page. Discussed ones only with includeDiscussed, archived ones with archived, Cascading Messages with isCascadedMessage. For every Team use list_company_headlines.

User, 3 operations

  • get_userGet userGETReturns one User by Id: first and last name, primary email, role and Team Ids (personal data).
  • list_team_usersList team usersGETLists the Users on one Team, ordered by name, with role, every Team Id, names and emails (personal data). The caller must be on that Team or be a company admin. includeInactive adds deactivated Users.
  • list_usersList usersGETLists the company's active Users with role, Team Ids, names and emails (personal data); includeInactive adds deactivated ones. email finds one person, to get the Id that create_todo and create_issue take as userId.

Comment, 2 operations

  • add_issue_commentAdd issue commentPOSTAdds one comment to an Issue as the token's user and returns the Issue's full comment list. Existing comments are kept. Callers who cannot edit the Issue get 403.
  • add_todo_commentAdd todo commentPOSTAdds one comment to a To-Do as the token's user and returns the To-Do's full comment list. Existing comments are kept.

Issue link, 2 operations

  • link_issueLink issuePOSTLinks an existing Issue to a To-Do, Rock or Milestone of the same company without changing the Issue. Needs a role that can create items and a seat on the Issue's Team (or Admin or Owner). 409 if already linked.
  • unlink_issueUnlink issueDELETERemoves the link between an Issue and a To-Do, Rock or Milestone, whichever side created it. The Issue itself is unchanged.

Measurable, 2 operations

  • list_company_measurablesList company measurablesGETLists every active Measurable across the company, by cursor, with its Teams, Scorecards and the scores dated between scoresFrom and scoresTo (at most 366 days apart). Owners and Admins only; others get 403.
  • query_measurablesQuery measurablesPOSTSearches the Measurables the caller can see by team, owner, interval and text: names, goals, owners and cadence without score values, one page at a time. Read values with get_measurable_score or get_team_scorecard.

Measurable note, 2 operations

  • delete_measurable_noteDelete measurable noteDELETEDeletes a Measurable's note for the period starting at periodStartDate.
  • set_measurable_noteSet measurable notePOSTWrites a Measurable's note for the period starting at periodStartDate, overwriting any note already there.

Rock link, 2 operations

  • link_rockLink rockPOSTLinks an existing Rock to a To-Do, Issue or Milestone of the same company without changing the Rock. Any role that can create items may link any company Rock. 409 if already linked.
  • unlink_rockUnlink rockDELETERemoves the link between a Rock and a To-Do, Issue or Milestone. The Rock itself is unchanged. Any role that can edit items may do it.

Team, 2 operations

  • list_available_teamsList available teamsGETReturns the Teams the token's user may create or query work for, each flagged isMember: their own Teams, plus every non-private Team for an Owner, Admin or Implementer. Use these _id values as teamId.
  • list_my_teamsList my teamsGETReturns the Teams the token's user belongs to (_id and name). To choose a Team for new work prefer list_available_teams, which also includes the Teams an Owner or Admin may use.

Todo link, 2 operations

  • link_todoLink todoPOSTLinks an existing To-Do to a Rock, Issue or Milestone of the same company without changing the To-Do. 409 if already linked.
  • unlink_todoUnlink todoDELETERemoves the link between a To-Do and a Rock, Issue or Milestone. The To-Do itself is unchanged.

Accountability chart, 1 operation

  • get_accountability_chartGet accountability chartGETReturns the company's primary Accountability Chart as a flat, top-down list of Seats with their responsibilities and holders (names, emails); rebuild the tree from parentSeatId. seatIds scopes it to those Seats and their ancestors.

Conversation, 1 operation

  • list_company_conversationsList company conversationsGETLists the company's quarterly or annual Conversations (manager and direct-report 1:1s): participants, due date and progress, never the answers. type is required. Owners and Admins on plans with Conversations only; others get 403.

Kpi group, 1 operation

  • list_company_kpi_groupsList company kpi groupsGETLists every KPI group on the company's Scorecards, newest first, by cursor, with each group's Measurable Ids in display order and no scores. Owners and Admins only; other roles get 403.

Scorecard, 1 operation

  • get_team_scorecardGet team scorecardGETReturns a Team's Scorecard (Measurables and scores) for a window of periods, or only the period containing date. Each score carries its period label as Ninety shows it (Q4, Jan 06 - Jan 12): pick periods by label.

Seat, 1 operation

  • list_company_seatsList company seatsGETLists the Seats of every Accountability Chart in the company (or of one chartId), flat and offset-paged, each with its responsibilities; rebuild each tree from chartId and parentSeatId. Owners and Admins only.

Seat holder, 1 operation

  • list_company_seat_holdersList company seat holdersGETLists who holds which Seat on every Accountability Chart (or one chartId): one row per holder with the user's name and email, offset-paged. A Seat with no row is vacant. Owners and Admins only; others get 403.

Vto, 1 operation

  • get_team_vtoGet team vtoGETReturns a Team's V/TO (Vision/Traction Organizer) beside the leadership Team's: Core Values, Core Focus, 1-Year Plan and 3-Year Picture goals. Sections not shared with the caller, or never filled in, come back empty.

Use Ninety from Claude Code, Cursor or Codex

Connect Ninety in LiveContext, create an API key in Settings, then add the LiveContext MCP server to your client. Its Ninety operations become tools the client can call, next to every other integration you connected.

Claude Code
claude mcp add --transport http livecontext https://livecontext.ai/mcp --header "X-API-Key: YOUR_API_KEY"
Codex (~/.codex/config.toml)
[mcp_servers.livecontext]
url = "https://livecontext.ai/mcp"

[mcp_servers.livecontext.http_headers]
"X-API-Key" = "YOUR_API_KEY"
Cursor, Claude Desktop and other JSON configs
{
  "mcpServers": {
    "livecontext": {
      "type": "http",
      "url": "https://livecontext.ai/mcp",
      "headers": {
        "X-API-Key": "YOUR_API_KEY"
      }
    }
  }
}

Set up the MCP server step by step

How to connect Ninety

  1. Create your workspace

    Sign up free. Nothing to install.

  2. Connect Ninety once

    Add your Ninety connection in Settings. Every tool from this integration reuses it, and secrets are encrypted at rest and visible only to you.

  3. Describe the job in chat

    The workflow builds itself in front of you and picks the endpoints it needs. Drag the steps yourself on the canvas whenever you would rather be explicit.

Ninety integration FAQ

What can you do with the Ninety integration?

LiveContext exposes 60 operations on Ninety, covering todo, issue, rock and measurable score.

Popular integrations

Browse the whole catalog