{
 "$schema": "https://agentdrives.com/schemas/tool.schema.json",
 "id": "prd_01m57vgtnej85mhrkz9ghqczef",
 "ids": {
  "org": "org_01m57vgtneh7edwwnd2ny08dkq",
  "surfaces": {
   "web": "srf_01m5c35yqzanf7cx8140mvn2qr",
   "api": "srf_01m5c35yqzy1xhdztj42nz4cew",
   "mcp": "srf_01m5c35yqztc7dbe4fwxeg4d37"
  },
  "slugs": [
   "niftypm"
  ],
  "domain": "niftypm.com"
 },
 "slug": "niftypm",
 "name": "Nifty",
 "url": "https://niftypm.com",
 "domain": "niftypm.com",
 "category": "project-management",
 "category_name": "Project management",
 "tested_at": "2026-10-20",
 "run": "20261020T061807Z",
 "draft": false,
 "reviewed": true,
 "owner_verified": null,
 "origin": "editorial",
 "history": [
  {
   "run": "20261020T061807Z",
   "date": "2026-10-20",
   "level": 4,
   "engine": {
    "runner": "omp",
    "model": "claude-opus-5-5",
    "driver": 4,
    "signed": true,
    "inbox": [
     "agentdrives.com"
    ],
    "robots": "skip"
   },
   "stop": null
  }
 ],
 "level": 4,
 "level_name": "Runs on its own",
 "level_selfhost": null,
 "entry": "self-start",
 "door": {
  "passed": 1,
  "tries": 1,
  "self_start": true
 },
 "badges": [
  "agent-can-leave"
 ],
 "not_counted": null,
 "stages": [
  {
   "key": "in",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up by email, sign-up in a browser",
   "way": "email_code"
  },
  {
   "key": "work",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the $16 a month charge",
   "value": "checkout",
   "route": "card_checkout"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted",
   "delete": {
    "state": "yes",
    "text": "Deletes its account",
    "why": null
   }
  }
 ],
 "outcomes": [
  {
   "key": "find",
   "label": "Learn",
   "state": "yes",
   "text": "Docs it can act on: llms.txt, an OpenAPI and an MCP server",
   "have": [
    "llms_txt",
    "openapi",
    "mcp"
   ],
   "docs": "complete"
  },
  {
   "key": "access",
   "label": "Access",
   "state": "yes",
   "text": "Gets in on its own: sign-up by email, sign-up in a browser",
   "way": "email_code",
   "stage": "in"
  },
  {
   "key": "use",
   "label": "Use",
   "state": "yes",
   "text": "Work done: 100% of the core",
   "stage": "work"
  },
  {
   "key": "pay",
   "label": "Pay",
   "state": "part",
   "text": "Reaches the checkout: stopped at the $16 a month charge",
   "value": "checkout",
   "route": "card_checkout",
   "stage": "pay"
  },
  {
   "key": "leave",
   "label": "Leave",
   "state": "yes",
   "text": "Leaves on its own: nothing to cancel, deletes its account",
   "left": "deleted",
   "delete": {
    "state": "yes",
    "text": "Deletes its account",
    "why": null
   },
   "stage": "leave"
  }
 ],
 "access": [
  {
   "key": "email_signup",
   "label": "Sign-up by email",
   "routes": [
    "email_password"
   ],
   "minutes": 0.5,
   "core": "0/9"
  },
  {
   "key": "browser_signup",
   "label": "Sign-up in a browser",
   "routes": [
    "email_code"
   ],
   "minutes": 8,
   "core": "9/9"
  }
 ],
 "minutes": 0.5,
 "next": {
  "to": 5,
  "text": "Next: pay without a person"
 },
 "stop": null,
 "core": "9/9",
 "scores": {
  "coverage": 73,
  "reliability": 82,
  "resilience": 80,
  "setup": 90,
  "surface_coverage": null,
  "docs_accuracy": null,
  "docs_completeness": null
 },
 "parts": {
  "holds_up": 81,
  "docs_match": null,
  "setup": 90,
  "security": "private",
  "standards": [
   {
    "standard": "MCP",
    "state": "behind",
    "behind": 1,
    "value": "2025-11-25"
   },
   {
    "standard": "MCP discovery",
    "state": "behind",
    "behind": null,
    "value": "legacy"
   },
   {
    "standard": "OpenAPI",
    "state": "behind",
    "behind": 1,
    "value": "3.1.0"
   }
  ]
 },
 "reliability_method": "pass^k",
 "resilience": {
  "parts": {
   "error_legibility": 91,
   "recovery": 100,
   "idempotency": 50
  },
  "summary": null
 },
 "stress": [
  {
   "capability": "Add a milestone to a project",
   "probe": "missing conditional field: milestone without start",
   "outcome": "400 {\"detail\": \"list start date is required when isMilestone=true\", \"errors\": [{\"field\": \"start\", \"code\": \"required\"}]}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a task or issue",
   "probe": "missing required projectId",
   "outcome": "400 {\"type\": \"project_not_specified\", \"title\": \"Project is required for this resource\", \"status\": 400, \"detail\": \"task create requires \\\"projectId\\\" in the request body\", \"instance\": \"/tasks\", \"code\":",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Update a task",
   "probe": "well-formed id that does not exist",
   "outcome": "404 {\"type\": \"resource_not_found\", \"title\": \"Resource not found\", \"status\": 404, \"detail\": \"task 'AAAAAAAAAA' not found or inaccessible\", \"instance\": \"/tasks/AAAAAAAAAA\", \"code\": \"resource_not_found\",",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Complete a task or change its status",
   "probe": "bad statusId on PATCH",
   "outcome": "404 {\"type\": \"resource_not_found\", \"title\": \"Resource not found\", \"status\": 404, \"detail\": \"status 'nonexistent' not found or inaccessible\", \"instance\": \"/tasks/3eYuCQyEV9\", \"code\": \"resource_not_foun",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a task or issue",
   "probe": "repeat create with same Idempotency-Key, then changed body",
   "outcome": "201 {\"first\": \"FFGTg9e84i\", \"second\": \"FFGTg9e84i\", \"replay_hdr\": {}, \"changed_body\": [201, \"FFGTg9e84i\"]}",
   "grade": "clear",
   "idempotent": "yes",
   "rate_limit": null
  },
  {
   "capability": "Create a task or issue",
   "probe": "repeat create without Idempotency-Key",
   "outcome": "201 {\"id\": \"3f5hRz5uMd\", \"first\": \"FFGTg9e84i\"}",
   "grade": "clear",
   "idempotent": "no",
   "rate_limit": null
  },
  {
   "capability": "Create a project or board",
   "probe": "burst of 15 GET /projects?limit=1",
   "outcome": "200 {\"statuses\": [200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200], \"x-ratelimit-remaining\": [\"2953\", \"2952\", \"2951\"], \"ratelimit\": null}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": "none-seen"
  },
  {
   "capability": "Create a project or board",
   "probe": "bad credential",
   "outcome": "401 {\"body\": {\"type\": \"unauthorized\", \"title\": \"Authentication required\", \"status\": 401, \"detail\": \"Unauthorized\", \"instance\": \"/projects?limit=1\", \"code\": \"unauthorized\", \"requestId\": \"f38afa2b-aa54-",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Add subtasks or a checklist",
   "probe": "partial failure: create-tree with one invalid subtask",
   "outcome": "404 {\"resp\": {\"type\": \"resource_not_found\", \"title\": \"Resource not found\", \"status\": 404, \"detail\": \"status 'nonexistent' not found or inaccessible\", \"instance\": \"/tasks/create-tree\", \"code\": \"resourc",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Make a task recurring",
   "probe": "bad enum value for recurring type",
   "outcome": "400 {\"type\": \"validation_failed\", \"title\": \"Validation failed\", \"status\": 400, \"detail\": \"Unknown recurring rule type 'weekly' \\u2014 expected one of date, status, completion\", \"instance\": \"/recurring",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Set a goal or OKR",
   "probe": "goal create with only the required fields",
   "outcome": "400 {\"type\": \"validation_failed\", \"title\": \"Validation failed\", \"status\": 400, \"detail\": \"value is required for this request\", \"instance\": \"/goals\", \"code\": \"validation_failed\", \"requestId\": \"4c076f00",
   "grade": "vague",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a form",
   "probe": "MCP form create with an argument the form does not take",
   "outcome": "200 Error unrecognized_argument: argument(s) name are not valid for resource 'form' operation 'create'... Valid argument(s): automation, docAccessType, fields, meta, ...",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  },
  {
   "capability": "Create a task or issue",
   "probe": "credential of a deleted user",
   "outcome": "401 {\"type\": \"unauthorized\", \"detail\": \"Unauthorized\", \"docsUrl\": \"https://developers.niftypm.com/docs/errors#unauthorized\"}",
   "grade": "clear",
   "idempotent": null,
   "rate_limit": null
  }
 ],
 "surface_audit": null,
 "coverage_core": 100,
 "coverage_own": 100,
 "after_wall": null,
 "coverage_source": "computed",
 "driver": {
  "version": 4,
  "model": "claude-opus-5-5",
  "profile": "full",
  "assisted": false,
  "handoff": false,
  "prompt_sha": "afceb4b82ffd",
  "kb_version": "3+overlay-fb2c175349",
  "identity": "e8a92f24a9a8"
 },
 "methodology": 24,
 "rules_date": "2026-10-20",
 "engine": {
  "runner": "omp",
  "model": "claude-opus-5-5",
  "driver": 4,
  "signed": true,
  "inbox": [
   "agentdrives.com"
  ],
  "robots": "skip"
 },
 "same_level_drives": 2,
 "drives": 2,
 "same_stop_drives": 1,
 "works_assisted": null,
 "freshness": "fresh",
 "newer_drives": {
  "count": 1,
  "newest": "2026-10-24"
 },
 "nothing_to_pay": false,
 "core_gated": false,
 "profiles": {},
 "agent_check": null,
 "agent_pass": {
  "rung": "signup",
  "vendor": "reCAPTCHA (script loaded, nothing shown)",
  "signed": true
 },
 "who_gets_in": {
  "server": {
   "state": "in"
  },
  "signed": {
   "state": "page",
   "kind": "signup",
   "at": "2026-10-24"
  },
  "browser": {
   "state": "in",
   "measured": false
  },
  "our_key": "pending",
  "robots": null,
  "tip": false
 },
 "ladder": {
  "docs": {
   "status": "headless",
   "note": "developers.niftypm.com: getting started, auth, errors, rate limits, webhooks, v3 OpenAPI 3.1.0 (146 paths, 234 operations), .md pages; MCP help article."
  },
  "signup": {
   "status": "browser",
   "note": "Web form only (app.niftypm.com/signup): work email, 4-digit code, name, password (phone optional), workspace name. Invisible reCAPTCHA let our signed agent through. The wizard keeps its state in the page: a reload goes back to the email step; logging in resumes it.",
   "way": "email_code"
  },
  "verify": {
   "status": "browser",
   "note": "Code mail came in under a minute; its 'Continue signing up' link verified the address."
  },
  "credentials": {
   "status": "browser",
   "note": "Personal access token made in Settings > API Tokens (Full access, 90 days); no API, CLI or device flow to create one. MCP OAuth takes pre-registered clients only.",
   "via": ""
  },
  "first_call": {
   "status": "headless",
   "note": "GET /api/v3/projects with the PAT: 200.",
   "route": "account"
  },
  "first_action": {
   "status": "headless",
   "note": "POST /api/v3/tasks 201, read back by GET /tasks/{id}."
  },
  "pay": {
   "status": "browser",
   "grade": "P2",
   "rails": [
    "Stripe Elements card form in the app"
   ],
   "rail_ids": [
    "stripe-elements"
   ],
   "first_party": true,
   "rail_scope": "none",
   "trial_path": "no-card trial",
   "route": "card_checkout",
   "checkout": {
    "reached": "card_form",
    "processor": "stripe_elements",
    "captcha": "none",
    "three_ds": "not_seen",
    "card_form": true,
    "phone_field": "none",
    "wallets": [
     "link"
    ],
    "rail_offer": "none",
    "price": "16.00",
    "currency": "USD",
    "period": "month",
    "plan": "Pro",
    "last_button": "PAY & UPGRADE"
   },
   "person": null,
   "ours": "no_card",
   "note": "No x402, MPP or billing API (options empty; our payment check paid nothing: no wallet). In the app, Billing > Change Plan > Monthly > Upgrade to Pro opens 'Activate Pro Plan': $16.00 due today, card fields, Country, ZIP, 'PAY & UPGRADE'. We stopped at the card: no card for this drive."
  },
  "cancel": {
   "status": "n/a",
   "note": "Nothing to cancel: our agent started no paid plan.",
   "docs_note": "Nothing to cancel: only the no-card 14-day Business trial was started. Plan changes live on the in-app Billing page ('Change Plan', 'Upgrade to Free'); no billing API.",
   "docs_grade": "",
   "nothing": "no_plan"
  },
  "delete": {
   "status": "browser",
   "note": "Settings > Security Settings > Delete current User (reason, type DELETE). Afterwards the PAT gets 401 on REST and MCP and the login fails. No delete API documented.",
   "left": "deleted",
   "after_hours": null,
   "account": true
  }
 },
 "routes": [
  {
   "route": "email_code",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "inbox",
   "fresh": true,
   "minutes": 8,
   "browser": true
  },
  {
   "route": "email_password",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "in",
   "wall": null,
   "person": "none",
   "brings": "inbox",
   "fresh": false,
   "minutes": 0.5,
   "browser": null
  },
  {
   "route": "oauth_consent",
   "offered": "seen",
   "tried": true,
   "not_tried": null,
   "result": "refused",
   "wall": {
    "type": "consent_needs_account",
    "owner": "product"
   },
   "person": "none",
   "brings": "nothing",
   "fresh": false,
   "minutes": 1,
   "browser": true
  }
 ],
 "checkout": {
  "reached": "card_form",
  "processor": "stripe_elements",
  "captcha": "none",
  "three_ds": "not_seen",
  "phone_field": "none",
  "wallets": [
   "link"
  ],
  "rail_offer": "none",
  "period": "month",
  "card_form": true,
  "price": "16.00",
  "currency": "USD",
  "plan": "Pro",
  "last_button": "PAY & UPGRADE"
 },
 "docs": {
  "at": "2026-10-20",
  "read": 110,
  "listed": 112,
  "sampled": false,
  "overall": "complete",
  "getting_started": "found",
  "auth": "found",
  "errors": "found",
  "examples": "some",
  "freshness": "fresh",
  "newest": "2026-10-15",
  "core_pages": "9 of 9",
  "capabilities": "covered"
 },
 "claims": {
  "claimed": 7,
  "tried": 7,
  "held": 6,
  "broken": 1,
  "unclear": 0,
  "not_tried": 0,
  "undocumented_works": 0
 },
 "pay_options": {
  "checked": "2026-10-20",
  "source": "probe",
  "options": [],
  "agentic": [],
  "paid": null,
  "exercised": null,
  "detected_grade": null,
  "trial": {
   "no_card": true,
   "card_required": null,
   "free_plan": true
  },
  "owner_fixes": [
   {
    "title": "Accept x402 or MPP on your API",
    "how": "Answer an unpaid call with 402 and a payment challenge, so an agent pays per call or buys credits without an account or a card."
   },
   {
    "title": "List your plans on Stripe Projects",
    "how": "Agents buy a plan with `stripe projects add`, paid with a token under a spend cap the owner sets (projects.dev)."
   }
  ]
 },
 "surfaces": {
  "api": true,
  "openapi": true,
  "cli": false,
  "sdk": false,
  "mcp": "official",
  "llms_txt": true,
  "webhooks": true,
  "sandbox": false
 },
 "surface_notes": {
  "api": "REST v3, 146 paths / 234 operations, cursor pagination, Idempotency-Key, RFC 7807-style errors with code and docsUrl; legacy v1.0 until 1 Sep 2027",
  "openapi": "3.1.0 at /docs/api/v3/0.136.0/nifty-v3-openapi.json; two conditional required fields not marked (project portfolioId, milestone start)",
  "mcp": "official, 21 tools, the older 25 Nov 2025 spec; forms create/update/delete advertised but not wired"
 },
 "can_do": [
  "Create, rename, complete, move and delete tasks, with subtasks (create-tree), checklists, dependencies and recurring rules",
  "Create, update and delete projects, milestones, docs (with append), chat messages and task comments",
  "Log, edit and delete time entries on a task",
  "Attach files to tasks and annotate an image file",
  "Create goals and portfolios, register and delete webhooks",
  "Create, rename and delete a form in the web app",
  "Drive all of it through the official MCP server with the same token"
 ],
 "cannot_do": [
  {
   "what": "Sign up or create an API token without a browser",
   "why": "Web form only; tokens are made only in Settings > API Tokens; OAuth is for pre-registered apps"
  },
  {
   "what": "Create, edit or delete forms over the API or MCP",
   "why": "v3 has GET only for forms; MCP form create answers route_not_found"
  },
  {
   "what": "Create custom fields or set project budgets over the API",
   "why": "Custom fields are read-only in v3 and v1.0; no budget field"
  },
  {
   "what": "Revoke a token",
   "why": "'Revoke all tokens' answered 200 but the token kept working"
  },
  {
   "what": "Pay without a card",
   "why": "Only a Stripe card form in the app; no agent rail or billing API"
  }
 ],
 "blockers": [
  "Sign-up and token creation are web-only",
  "Token revocation did not take effect"
 ],
 "tips_for_agents": [
  "Make the PAT once in Settings > API Tokens; it works on REST v3 (https://openapi.niftypm.com/api/v3) and as Bearer on the MCP server (use protocol 2025-11-25)",
  "Send Idempotency-Key on creates: the same key returns the same object (even with a changed body)",
  "POST /projects needs portfolioId (GET /portfolios) in a fresh workspace; milestones need start",
  "Errors carry code and docsUrl: branch on code",
  "The sign-up wizard keeps state in the page: do email and code in one session, or log in to resume",
  "Forms only in the web app (Project > +5 > Forms); the MCP form ops fail"
 ],
 "selfhost": null,
 "summary": "Nifty's v3 REST API and official MCP server let an agent do all nine core jobs once it has a token: tasks, status, projects, milestones, docs, chat, time entries over the API, and forms in the web app. Getting in takes a browser (web-only sign-up with a mailed code, token made in Settings) and paying takes a card in a Stripe form. 'Revoke all tokens' did not revoke the token.",
 "wall": "Token made only in the web app",
 "plan_scope": "no-card trial (14-day Business trial)",
 "robots_stop": null,
 "robots": null,
 "terms": null,
 "plain": {
  "summary": "Nifty is a project-management tool (tasks, projects, docs, chat, time tracking). Once the agent had a login token, its API and official MCP server let it create, update and delete almost everything on its own; only building a form and buying a paid plan needed the web app. It stopped at a plain sign-up form and a credit-card checkout page, both of which need a person to click through or pay.",
  "can_do": [
   "Create, rename, finish and delete tasks, with subtasks, checklists and recurring schedules",
   "Create and delete whole projects, milestones and documents",
   "Post and edit chat messages and log time entries",
   "Set up webhooks and goals",
   "Use the same login token on the official MCP server",
   "Build or delete a form in the web app"
  ],
  "cannot_do": [
   {
    "what": "Sign up or make its own login token without a browser",
    "why": "The sign-up form and token page only exist in the web app"
   },
   {
    "what": "Buy a paid plan on its own",
    "why": "Upgrading needs a credit card typed into a payment form"
   },
   {
    "what": "Create, edit or delete a form through the API",
    "why": "The API only lets you read forms, not create them"
   },
   {
    "what": "Trust 'Revoke all tokens'",
    "why": "It said success but the old token kept working"
   }
  ]
 },
 "plan_gated": [],
 "reply": null,
 "capabilities": [
  {
   "id": "cap-01",
   "capability": "Create a task or issue",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/tasks",
    "mcp": null,
    "cli": null,
    "ui": "Project > Tasks"
   },
   "check": "GET /api/v3/tasks/{id} returns the created task",
   "capability_id": "cap_kzejkm30",
   "unmapped": null,
   "source": "https://developers.niftypm.com/docs/getting-started; https://niftypm.com/tasks/",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-02",
   "capability": "Update a task",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /api/v3/tasks/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Project > Tasks"
   },
   "check": "GET /api/v3/tasks/{id} shows updated fields",
   "capability_id": "cap_w43xz129",
   "unmapped": null,
   "source": "https://developers.niftypm.com/docs/getting-started",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-03",
   "capability": "Complete a task or change its status",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "PATCH /api/v3/tasks/{id}",
    "mcp": null,
    "cli": null,
    "ui": "Project > Tasks"
   },
   "check": "GET /api/v3/tasks/{id} shows status in a done/taskgroup (statuses) state",
   "capability_id": "cap_0qqya2hj",
   "unmapped": null,
   "source": "https://developers.niftypm.com/docs/getting-started; https://niftypm.com/pricing/",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-04",
   "capability": "Create a project or board",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/projects",
    "mcp": null,
    "cli": null,
    "ui": "Home > New project"
   },
   "check": "GET /api/v3/projects/{id} returns the created project",
   "capability_id": "cap_pe5me100",
   "unmapped": null,
   "source": "https://developers.niftypm.com/docs/getting-started",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-05",
   "capability": "Add a milestone to a project",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/lists (v1.0: milestones)",
    "mcp": null,
    "cli": null,
    "ui": "Project > Milestones (Roadmap)"
   },
   "check": "GET /api/v3/lists/{id} shows the milestone on the project roadmap",
   "capability_id": "cap_9xs2hcsv",
   "unmapped": null,
   "source": "https://niftypm.com/milestones/; https://developers.niftypm.com/docs/getting-started#migrating-from-v1",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-06",
   "capability": "Create a doc or wiki page",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/documents (v1.0: docs)",
    "mcp": null,
    "cli": null,
    "ui": "Project > Docs & Files"
   },
   "check": "GET /api/v3/documents/{id} returns the created document",
   "capability_id": "cap_yvyjytn1",
   "unmapped": null,
   "source": "https://niftypm.com/docs/; https://developers.niftypm.com/docs/getting-started#migrating-from-v1",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-07",
   "capability": "Send a chat message",
   "weight": "core",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project > Discussions"
   },
   "check": "UI shows the message posted in the project Discussion thread",
   "capability_id": "cap_y0kyhz5h",
   "unmapped": null,
   "source": "https://niftypm.com/discussions/",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-08",
   "capability": "Create a form",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project > Forms"
   },
   "check": "Form appears in the project's Forms list and is publishable",
   "capability_id": "cap_kch2ns0f",
   "unmapped": null,
   "source": "https://niftypm.com/forms/; https://niftypm.com/pricing/ (Native Forms: Business+)",
   "result": "done",
   "via": "browser"
  },
  {
   "id": "cap-09",
   "capability": "Log time on a task or project",
   "weight": "core",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/v3/time-entries (v1.0: time)",
    "mcp": null,
    "cli": null,
    "ui": "Task > Time Tracking"
   },
   "check": "GET /api/v3/time-entries?taskId={id} shows the logged entry",
   "capability_id": "cap_nqxg2m23",
   "unmapped": null,
   "source": "https://niftypm.com/time-tracking/; https://niftypm.com/pricing/ (Pro+); https://developers.niftypm.com/docs/getting-started#migrating-from-v1",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-10",
   "capability": "Set a goal or OKR",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Workspace > Goals"
   },
   "check": "UI shows the Goal with its target and linked tasks",
   "capability_id": "cap_xn2ftnc2",
   "unmapped": null,
   "source": "https://niftypm.com/goals/; https://niftypm.com/pricing/ (Goals Tracking: Business+)",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-11",
   "capability": "Add subtasks or a checklist",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v3/tasks (parentId / checklist fields)",
    "mcp": null,
    "cli": null,
    "ui": "Task detail"
   },
   "check": "GET /api/v3/tasks/{id}?expand=subtasks shows the added items",
   "capability_id": "cap_h0gtw67e",
   "unmapped": null,
   "source": "https://niftypm.com/tasks/",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-12",
   "capability": "Set a dependency between tasks",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Task detail > Dependencies"
   },
   "check": "UI shows the task blocked by/blocking the linked task",
   "capability_id": "cap_tvr8b22p",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Task Dependencies, Milestone Dependencies: Free+)",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-13",
   "capability": "Make a task recurring",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Task detail > Repeat"
   },
   "check": "UI shows the task's recurrence schedule; a new instance appears after the cycle",
   "capability_id": "cap_fmby6fs6",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Recurring Tasks: Free+); https://niftypm.com/ai/ (AI recurring tasks)",
   "result": "failed",
   "via": "api"
  },
  {
   "id": "cap-14",
   "capability": "Set a custom field on a task",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "PATCH /api/v3/tasks/{id} (v3 resource: custom-fields; v1.0: fields)",
    "mcp": null,
    "cli": null,
    "ui": "Task detail > Custom Fields"
   },
   "check": "GET /api/v3/tasks/{id}?expand=customFields shows the set value",
   "capability_id": "cap_6ed0ed0y",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Custom Fields: Pro+); https://developers.niftypm.com/docs/getting-started#migrating-from-v1",
   "result": "failed",
   "via": "api"
  },
  {
   "id": "cap-15",
   "capability": "Group projects into a portfolio",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": "GET/POST /api/v3/portfolios (v1.0: subteams)",
    "mcp": null,
    "cli": null,
    "ui": "Portfolios"
   },
   "check": "GET /api/v3/portfolios/{id}?expand=projects lists the grouped projects",
   "capability_id": "cap_2kerdktz",
   "unmapped": null,
   "source": "https://niftypm.com/portfolios/; https://developers.niftypm.com/docs/getting-started#migrating-from-v1",
   "result": "failed",
   "via": "api"
  },
  {
   "id": "cap-16",
   "capability": "Read team workload",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Reporting > Team Workloads"
   },
   "check": "UI shows per-member workload across projects",
   "capability_id": "cap_ytgdmqbh",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Team Workloads: Business+); https://niftypm.com/overview/",
   "result": "partial",
   "via": "mcp"
  },
  {
   "id": "cap-17",
   "capability": "Read a project report",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Reporting / Overview"
   },
   "check": "UI shows the cross-project status dashboard",
   "capability_id": "cap_fhmexa68",
   "unmapped": null,
   "source": "https://niftypm.com/overview/",
   "result": "done",
   "via": "mcp"
  },
  {
   "id": "cap-18",
   "capability": "Post a project status update",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project Home"
   },
   "check": "UI shows the automated/manual status update on Project Home",
   "capability_id": "cap_xst5ch8x",
   "unmapped": null,
   "source": "https://niftypm.com/project-home/",
   "result": "failed",
   "via": "api"
  },
  {
   "id": "cap-19",
   "capability": "Collect file uploads in a form",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Forms editor"
   },
   "check": "Submitted response shows the uploaded file attached",
   "capability_id": "cap_c4emtyfj",
   "unmapped": null,
   "source": "https://niftypm.com/forms/",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-20",
   "capability": "Automate actions on form submissions",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Forms > Automation"
   },
   "check": "A submitted response creates the configured task/doc/message, visible in the target resource",
   "capability_id": "cap_730bvpf7",
   "unmapped": null,
   "source": "https://niftypm.com/forms/ (Create a task / Send a message / Create a doc from form responses)",
   "result": "partial",
   "via": "browser"
  },
  {
   "id": "cap-21",
   "capability": "Attach a file to a task",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Task detail > Files"
   },
   "check": "UI/task shows the attached file",
   "capability_id": "cap_xtf1jdyh",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Files: Free+)",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-22",
   "capability": "Comment on a task",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Task detail > Comments"
   },
   "check": "UI shows the posted comment on the task",
   "capability_id": "cap_4zn5cq20",
   "unmapped": null,
   "source": "https://niftypm.com/tasks/",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-23",
   "capability": "Register a webhook",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": "POST /api/v3/webhooks",
    "mcp": null,
    "cli": null,
    "ui": null
   },
   "check": "GET /api/v3/webhooks/{id} returns the registration; a subscribed event triggers a delivery visible via GET /api/v3/webhooks/{id}/deliveries",
   "capability_id": "cap_977hxacb",
   "unmapped": null,
   "source": "https://developers.niftypm.com/docs/webhooks; https://niftypm.com/pricing/ (Open API: Business+)",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-24",
   "capability": "Export form responses",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Forms > Responses"
   },
   "check": "Downloaded export file contains the submitted responses",
   "capability_id": "cap_8vr2dv28",
   "unmapped": null,
   "source": "https://niftypm.com/forms/ (Collect Responses)",
   "result": "partial",
   "via": "api"
  },
  {
   "id": "cap-25",
   "capability": "Proof a file with annotations",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Task > Files > Proofing"
   },
   "check": "UI shows the annotation/markup saved on the file version",
   "capability_id": "cap_xymhbkg7",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (File Proofing: Pro+)",
   "result": "done",
   "via": "api"
  },
  {
   "id": "cap-26",
   "capability": "Set a project budget or billable rates",
   "weight": "secondary",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Project > Settings > Budget"
   },
   "check": "UI shows the configured budget/rate and tracked spend against it",
   "capability_id": "cap_k5402fva",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Budget Tracking: Pro+)",
   "result": "failed",
   "via": "api"
  },
  {
   "id": "cap-27",
   "capability": "Delegate a task to the built-in AI agent",
   "weight": "secondary",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Orbit AI"
   },
   "check": "Orbit AI produces the generated task/doc/project visible in the target project",
   "capability_id": "cap_4ew83zqz",
   "unmapped": null,
   "source": "https://niftypm.com/ai/",
   "result": "failed",
   "via": "api"
  },
  {
   "id": "cap-28",
   "capability": "Create a user group",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Team"
   },
   "check": "UI shows the created group with assigned members",
   "capability_id": "cap_yn12vxg9",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Custom Roles & Permissions: Business+)",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-29",
   "capability": "Set a member's role or permissions",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Team > Roles"
   },
   "check": "UI shows the member's updated role/permission set",
   "capability_id": "cap_bs3hvrpm",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Custom Roles & Permissions: Business+)",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-30",
   "capability": "Invite a member",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": "POST /api/v1.0/invites",
    "mcp": null,
    "cli": null,
    "ui": "Settings > Team > Invite"
   },
   "check": "GET /api/v1.0/invites shows the pending invite",
   "capability_id": "cap_3w8sjh12",
   "unmapped": null,
   "source": "https://developers.niftypm.com/docs/getting-started#migrating-from-v1 (invites listed as v1.0-only resource)",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-31",
   "capability": "Enable two-factor authentication",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Security"
   },
   "check": "UI shows 2FA enabled on the account",
   "capability_id": "cap_9qz744jy",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Two-Factor Authentication: Free+)",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-32",
   "capability": "Configure SAML SSO",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Security > SSO"
   },
   "check": "UI shows the configured SAML SSO provider active for the workspace",
   "capability_id": "cap_pz4pecfg",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Custom SAML: Unlimited)",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-33",
   "capability": "Connect a custom domain",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Custom Domain"
   },
   "check": "Workspace is reachable under the configured custom domain",
   "capability_id": "cap_dj4n5a69",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (Custom Domain: Business+)",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-34",
   "capability": "Remove the product's branding",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > White Labeling"
   },
   "check": "UI/client-facing surfaces no longer show Nifty branding",
   "capability_id": "cap_n2ya4t0w",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (White Labeling: Unlimited)",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-35",
   "capability": "Restrict access by IP address",
   "weight": "peripheral",
   "plan": "paid",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > Security > IP Restriction"
   },
   "check": "A request from a non-allow-listed IP is blocked from signing in",
   "capability_id": "cap_wrzp7nnm",
   "unmapped": null,
   "source": "https://niftypm.com/pricing/ (IP Restriction: Unlimited)",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-36",
   "capability": "Connect a third-party integration",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Settings > App Center"
   },
   "check": "UI shows the connected integration (e.g. Slack, Google Drive) active",
   "capability_id": "cap_x4n6bnwy",
   "unmapped": null,
   "source": "https://niftypm.com/integrations/; https://developers.niftypm.com/docs/build-on-nifty (App Center)",
   "result": "not_tried",
   "via": null
  },
  {
   "id": "cap-37",
   "capability": "Work from the mobile or desktop app",
   "weight": "peripheral",
   "plan": "free",
   "surfaces": {
    "api": null,
    "mcp": null,
    "cli": null,
    "ui": "Native apps (Mac, Windows, iOS, Android, Chrome)"
   },
   "check": "App is installable and signs in to the workspace",
   "capability_id": "cap_p675qb2x",
   "unmapped": null,
   "source": "https://niftypm.com/apps/",
   "result": "not_tried",
   "via": null
  }
 ],
 "stale": false,
 "unreachable_since": null,
 "not_driven_since": null,
 "icon": "/logos/niftypm.png",
 "agent_kinds": {
  "browser": {
   "who": "An assistant in a browser",
   "passed": [
    "signup",
    "verify",
    "first_action"
   ],
   "stop": "pay",
   "why": "reaches the checkout, stopped at the $16 a month charge",
   "tone": "warn",
   "text": "Signs up, confirms its email and does all of the core work. Payment: reaches the checkout, stopped at the $16 a month charge."
  },
  "direct": {
   "who": "An agent talking to it directly",
   "passed": [],
   "stop": "signup",
   "why": "it works only in a browser",
   "tone": "wall",
   "text": "Stops at sign-up: it works only in a browser."
  }
 },
 "stop_evidence": null,
 "stop_shot": null,
 "attempts_count": 198,
 "detail": {
  "public": false,
  "in": [
   "report",
   "api"
  ],
  "since": "2026-10-17"
 },
 "what_it_does": "Nifty is a project-management tool for tasks, projects, written notes, chat and time tracking, with an API and an official MCP server.",
 "rules_version": "rules-2026-10-20-24",
 "rules_url": "https://agentdrives.com/method/changelog#rules-2026-10-20-24",
 "category_median": null,
 "verdict": "L4 · Runs on its own: it signs up and confirms its address in a browser, then makes a Personal Access Token in Settings. An invisible reCAPTCHA at signup let it through. From there it does the core work over the API and MCP: tasks, status, projects, milestones, docs, chat and time entries, with forms handled in the web app. It stopped at paying: Billing's Activate Pro Plan asked for a card, which this drive didn't carry, so it started no plan and had nothing to cancel. Deleting the account in Security Settings revoked the token: it got 401 on both the API and MCP afterward.",
 "changes": {
  "source": "store",
  "drives": [
   {
    "run": "20261020T061807Z",
    "date": "2026-10-20",
    "level": 4,
    "stop": null,
    "entry": "self-start",
    "driver": 4,
    "listed": true
   },
   {
    "run": "20261024T031249Z",
    "date": "2026-10-24",
    "level": 4,
    "stop": null,
    "entry": "self-start",
    "driver": 4,
    "listed": true
   }
  ],
  "events": [],
  "feed": "https://agentdrives.com/api/tools/niftypm/changes.json"
 },
 "agreement": {
  "drives": 2,
  "agree": 2
 },
 "method_release": "2026-Q4.9",
 "rank": 1,
 "rank_of": 4,
 "rank_change": 0,
 "rank_since": "2026-10-24",
 "capability_matrix": [
  {
   "id": "cap-01",
   "name": "Create a task or issue",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-02",
   "name": "Update a task",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-03",
   "name": "Complete a task or change its status",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-04",
   "name": "Create a project or board",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-05",
   "name": "Add a milestone to a project",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-06",
   "name": "Create a doc or wiki page",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-07",
   "name": "Send a chat message",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-08",
   "name": "Create a form",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "done"
   }
  },
  {
   "id": "cap-09",
   "name": "Log time on a task or project",
   "core": true,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-10",
   "name": "Set a goal or OKR",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-11",
   "name": "Add subtasks or a checklist",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-12",
   "name": "Set a dependency between tasks",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-13",
   "name": "Make a task recurring",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-14",
   "name": "Set a custom field on a task",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-15",
   "name": "Group projects into a portfolio",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-16",
   "name": "Read team workload",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "none",
    "mcp": "partial",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-17",
   "name": "Read a project report",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "none",
    "mcp": "done",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-18",
   "name": "Post a project status update",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-19",
   "name": "Collect file uploads in a form",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-20",
   "name": "Automate actions on form submissions",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "partial"
   }
  },
  {
   "id": "cap-21",
   "name": "Attach a file to a task",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-22",
   "name": "Comment on a task",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-23",
   "name": "Register a webhook",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "none"
   }
  },
  {
   "id": "cap-24",
   "name": "Export form responses",
   "core": false,
   "result": "partial",
   "surfaces": {
    "api": "partial",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-25",
   "name": "Proof a file with annotations",
   "core": false,
   "result": "done",
   "surfaces": {
    "api": "done",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-26",
   "name": "Set a project budget or billable rates",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-27",
   "name": "Delegate a task to the built-in AI agent",
   "core": false,
   "result": "blocked",
   "surfaces": {
    "api": "blocked",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-28",
   "name": "Create a user group",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-29",
   "name": "Set a member's role or permissions",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-30",
   "name": "Invite a member",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "untried",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-31",
   "name": "Enable two-factor authentication",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-32",
   "name": "Configure SAML SSO",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-33",
   "name": "Connect a custom domain",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-34",
   "name": "Remove the product's branding",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-35",
   "name": "Restrict access by IP address",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-36",
   "name": "Connect a third-party integration",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  },
  {
   "id": "cap-37",
   "name": "Work from the mobile or desktop app",
   "core": false,
   "result": "untried",
   "surfaces": {
    "api": "none",
    "mcp": "none",
    "cli": "none",
    "ui": "untried"
   }
  }
 ],
 "category_place": {
  "category": "project-management",
  "products": 15,
  "higher": 0,
  "same_level": 3,
  "as_of": "2026-10-22",
  "stop": null,
  "rivals_by": "level",
  "rivals": [
   "monday",
   "plane",
   "shortcut"
  ]
 },
 "page": "https://agentdrives.com/tools/niftypm?via=api"
}