[{"data":1,"prerenderedAt":975},["ShallowReactive",2],{"integrations-es:/integrations/cursor":3},{"id":4,"title":5,"active":6,"body":7,"description":961,"extension":962,"eyebrow":963,"icon":964,"image":965,"meta":966,"name":145,"navTitle":145,"navigation":6,"order":967,"path":968,"seo":969,"slug":970,"status":971,"stem":972,"summary":973,"toc":964,"__hash__":974},"integrations_en/integrations/cursor.md","Cursor + OpenPets",true,{"type":8,"value":9,"toc":932},"minimark",[10,129,182,392,551,609,654,720,833,917],[11,12,16,17,16,22,16,26,16,119],"section",{"id":13,"className":14},"overview",[15],"docs-section","\n  ",[18,19,21],"h2",{"id":20},"what-this-integration-does","What this integration does",[23,24,25],"p",{},"\n    The Cursor integration gives Cursor the OpenPets MCP tools and an optional\n    short project rule that teaches Cursor when to use them. It has one MCP\n    layer and one optional rules layer; you can install either or both.\n  ",[27,28,31,32,16],"div",{"className":29},[30],"docs-table-wrap","\n    ",[33,34,35,36,35,53,31],"table",{},"\n      ",[37,38,39,40,35],"thead",{},"\n        ",[41,42,43,47,50],"tr",{},[44,45,46],"th",{},"Part",[44,48,49],{},"Required?",[44,51,52],{},"What it gives Cursor",[54,55,39,56,39,89,39,106,35],"tbody",{},[41,57,58,59,58,66,58,69,39],{},"\n          ",[60,61,62],"td",{},[63,64,65],"strong",{},"MCP server",[60,67,68],{},"Yes",[60,70,71,72,76,77,80,81,84,85,88],{},"Tools named ",[73,74,75],"code",{},"openpets_status",", ",[73,78,79],{},"openpets_react",", and ",[73,82,83],{},"openpets_say"," via ",[73,86,87],{},"@open-pets/mcp",".",[41,90,58,91,58,96,58,99,39],{},[60,92,93],{},[63,94,95],{},"Project rules",[60,97,98],{},"Optional",[60,100,101,102,105],{},"A short ",[73,103,104],{},".mdc"," rule that tells Cursor when to use the OpenPets tools and what never to put in pet messages.",[41,107,58,108,58,113,58,116,39],{},[60,109,110],{},[63,111,112],{},"Hooks / lifecycle reactions",[60,114,115],{},"Not yet",[60,117,118],{},"Ambient Cursor hooks are a future phase and intentionally not written until a validation spike is complete.",[23,120,121,122,124,125,128],{},"\n    Runtime is local. Cursor launches ",[73,123,87],{}," as a stdio MCP\n    server, the server uses ",[73,126,127],{},"@open-pets/client",", and the client talks\n    to the running OpenPets desktop app over local IPC. If OpenPets is closed,\n    Cursor keeps working; pet updates are best-effort feedback.\n  ",[11,130,16,133,16,136,16,155,16,179],{"id":131,"className":132},"quick-install",[15],[18,134,135],{"id":131},"Quick install",[23,137,138,139,142,143,146,147,150,151,154],{},"\n    In the OpenPets desktop app, open ",[63,140,141],{},"Integrations"," and use the\n    ",[63,144,145],{},"Cursor"," card. ",[63,148,149],{},"Install global setup"," writes\n    the global Cursor MCP entry for your user account, and ",[63,152,153],{},"Configure","\n    opens the detail panel for pet routing, JSON preview, and remove actions.\n  ",[156,157,31,158,31,171,31,176,16],"ul",{},[159,160,161,163,164,167,168,88],"li",{},[63,162,149],{}," adds the ",[73,165,166],{},"openpets"," MCP server to ",[73,169,170],{},"~/.cursor/mcp.json",[159,172,173,175],{},[63,174,153],{}," opens advanced status, pet routing, project rules preview, and remove controls.",[159,177,178],{},"Restart Cursor, reload the window, or start a fresh chat if OpenPets tools do not appear immediately.",[23,180,181],{},"\n    Desktop setup is global and can affect every Cursor project on that machine.\n    For repository-specific setup or to add the project rule, use the CLI\n    commands below.\n  ",[11,183,16,186,16,189,16,195,16,251,16,256,16,265,16,310,16,314,16,335,16,349,16,353,16,370,16,386],{"id":184,"className":185},"mcp-connection",[15],[18,187,188],{"id":184},"MCP connection",[23,190,191,192,194],{},"\n    MCP is the main Cursor-to-OpenPets bridge. OpenPets writes a single MCP\n    entry named ",[73,193,166],{},"; unrelated MCP servers and top-level\n    fields in your Cursor config are preserved.\n  ",[27,196,31,198,16],{"className":197},[30],[33,199,35,200,35,213,31],{},[37,201,39,202,35],{},[41,203,204,207,210],{},[44,205,206],{},"Tool",[44,208,209],{},"Purpose",[44,211,212],{},"When Cursor should use it",[54,214,39,215,39,227,39,239,35],{},[41,216,58,217,58,221,58,224,39],{},[60,218,219],{},[73,220,75],{},[60,222,223],{},"Checks whether the OpenPets desktop app is reachable and which pet is targeted.",[60,225,226],{},"Before using OpenPets, or when debugging setup.",[41,228,58,229,58,233,58,236,39],{},[60,230,231],{},[73,232,79],{},[60,234,235],{},"Changes the pet reaction without showing text.",[60,237,238],{},"For silent state changes like thinking, editing, testing, waiting, success, or error.",[41,240,58,241,58,245,58,248,39],{},[60,242,243],{},[73,244,83],{},[60,246,247],{},"Shows one short visible speech bubble.",[60,249,250],{},"For meaningful progress, blockers, completion, or review handoff.",[252,253,255],"h3",{"id":254},"global-vs-project-mcp-config","Global vs project MCP config",[23,257,258,259,261,262,264],{},"\n    Cursor merges global and project MCP config. When both define an\n    ",[73,260,166],{}," server, the project entry wins for that workspace.\n    OpenPets always uses the server name ",[73,263,166],{}," so you can\n    override a global default per repository.\n  ",[27,266,31,268,16],{"className":267},[30],[33,269,35,270,35,283,31],{},[37,271,39,272,35],{},[41,273,274,277,280],{},[44,275,276],{},"Setup style",[44,278,279],{},"Best for",[44,281,282],{},"File",[54,284,39,285,39,297,35],{},[41,286,58,287,58,290,58,293,39],{},[60,288,289],{},"Global desktop setup",[60,291,292],{},"Personal machine-wide Cursor setup.",[60,294,295],{},[73,296,170],{},[41,298,58,299,58,302,58,305,39],{},[60,300,301],{},"Project-local CLI setup",[60,303,304],{},"Repos that should explicitly carry OpenPets setup.",[60,306,307],{},[73,308,309],{},"\u003Cproject>/.cursor/mcp.json",[252,311,313],{"id":312},"expected-mcp-entry","Expected MCP entry",[27,315,31,318,31,329,16],{"className":316},[317],"docs-code",[27,319,322,326],{"className":320},[321],"docs-code-bar",[323,324,325],"span",{},"~/.cursor/mcp.json or \u003Cproject>/.cursor/mcp.json",[323,327,328],{},"json",[330,331,332],"pre",{},[73,333,334],{},"{\n  \"mcpServers\": {\n    \"openpets\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@open-pets/mcp@latest\", \"--pet\", \"\u003Cpet-id>\"]\n    }\n  }\n}",[23,336,337,338,341,342,344,345,348],{},"\n    If no pet is selected, ",[73,339,340],{},"--pet \u003Cpet-id>"," is omitted and OpenPets\n    routes to the desktop default pet. OpenPets pins a specific\n    ",[73,343,87],{}," version when it writes the entry; the\n    ",[73,346,347],{},"@latest"," shown above is the readable equivalent for manual setup.\n  ",[252,350,352],{"id":351},"project-setup-with-the-cli","Project setup with the CLI",[27,354,31,356,31,365,16],{"className":355},[317],[27,357,359,362],{"className":358},[321],[323,360,361],{},"Project MCP only",[323,363,364],{},"bash",[330,366,367],{},[73,368,369],{},"npx -y @open-pets/cli@latest configure --agent cursor --pet \u003Cpet-id>",[27,371,31,373,31,381,16],{"className":372},[317],[27,374,376,379],{"className":375},[321],[323,377,378],{},"Project MCP from another directory",[323,380,364],{},[330,382,383],{},[73,384,385],{},"npx -y @open-pets/cli@latest configure --agent cursor --cwd /path/to/project --pet \u003Cpet-id>",[23,387,31,388,391],{},[73,389,390],{},"--pet"," is optional. If omitted, the CLI may prompt from installed\n    pets via the running desktop app.\n  ",[11,393,16,396,16,400,16,403,16,419,16,435,16,451,16,461,16,478,16,482,540],{"id":394,"className":395},"project-rules",[15],[18,397,399],{"id":398},"optional-project-rules","Optional project rules",[23,401,402],{},"\n    Cursor rules are prompt guidance, not lifecycle hooks. The OpenPets rule\n    tells Cursor when and how to use the MCP tools safely. It is optional and\n    project-local only; OpenPets does not edit Cursor's user or global rules\n    settings.\n  ",[27,404,31,406,31,414,16],{"className":405},[317],[27,407,409,412],{"className":408},[321],[323,410,411],{},"Install or update the project rule only",[323,413,364],{},[330,415,416],{},[73,417,418],{},"npx -y @open-pets/cli@latest configure --agent cursor --rules-only",[27,420,31,422,31,430,16],{"className":421},[317],[27,423,425,428],{"className":424},[321],[323,426,427],{},"Install MCP and rules together",[323,429,364],{},[330,431,432],{},[73,433,434],{},"npx -y @open-pets/cli@latest configure --agent cursor --pet \u003Cpet-id> --with-rules",[27,436,31,438,31,446,16],{"className":437},[317],[27,439,441,444],{"className":440},[321],[323,442,443],{},"Remove only the managed rule",[323,445,364],{},[330,447,448],{},[73,449,450],{},"npx -y @open-pets/cli@latest configure --agent cursor --remove-rules",[23,452,31,453,456,457,460],{},[73,454,455],{},"--rules-only"," and ",[73,458,459],{},"--remove-rules"," do not require a\n    pet selection or the OpenPets desktop app to be running. The rule file is\n    written to:\n  ",[27,462,31,464,31,473,16],{"className":463},[317],[27,465,467,470],{"className":466},[321],[323,468,469],{},"Rule path",[323,471,472],{},"text",[330,474,475],{},[73,476,477],{},"\u003Cproject>/.cursor/rules/openpets.mdc",[252,479,481],{"id":480},"rule-content","Rule content",[27,483,31,485,31,494],{"className":484},[317],[27,486,488,491],{"className":487},[321],[323,489,490],{},".cursor/rules/openpets.mdc",[323,492,493],{},"mdc",[330,495,496,510],{},[73,497,498,499,502,507],{},"---\ndescription: Use OpenPets MCP tools for lightweight coding-status feedback.\n---\n",[23,500,501],{},"\u003C!-- OPENPETS:CURSOR_RULES:START -->",[503,504,506],"h1",{"id":505},"openpets-status-feedback","OpenPets status feedback",[23,508,509],{},"You may use the OpenPets MCP tools as a brief, safe status channel during meaningful coding work.",[156,511,512,535],{},[73,513,514,520,526,529,532],{},[159,515,516,517,519],{},"Use ",[73,518,83],{}," sparingly for major milestones, blocking states, completion, or when review is needed.",[159,521,522,523,525],{},"Prefer ",[73,524,79],{}," over speech for lightweight progress such as thinking, working, testing, success, or error.",[159,527,528],{},"Keep messages short, user-facing, and safe.",[159,530,531],{},"Do not send prompts, tool input/output, code, logs, stack traces, credentials, private file contents, URLs, file paths, or other sensitive content through OpenPets.",[159,533,534],{},"Do not spam every internal step; use OpenPets only for meaningful progress changes and continue normally if a status update is unnecessary.",[159,536,537],{},[73,538,539],{},"If OpenPets is unavailable, continue the coding task without failing.\n\u003C!-- OPENPETS:CURSOR_RULES:END -->",[23,541,542,543,546,547,550],{},"\n  OpenPets intentionally does ",[63,544,545],{},"not"," set ",[73,548,549],{},"alwaysApply: true","\n  so the rule stays out of every prompt by default. Cursor will include the\n  rule when the workspace is open; a new chat may be needed for changes to be\n  picked up.\n",[11,552,16,555,16,559,16,571,16,587],{"id":553,"className":554},"force-and-conflicts",[15],[18,556,558],{"id":557},"force-conflicts-and-backups","Force, conflicts, and backups",[23,560,561,562,566,567,570],{},"\n    OpenPets refuses to overwrite unknown user content by default. When the MCP\n    entry or rule file looks different from what OpenPets manages, status is\n    reported as ",[563,564,565],"em",{},"custom"," or ",[563,568,569],{},"conflict"," and nothing is rewritten\n    without an explicit opt-in.\n  ",[27,572,31,574,31,582,16],{"className":573},[317],[27,575,577,580],{"className":576},[321],[323,578,579],{},"Force replace, scoped",[323,581,364],{},[330,583,584],{},[73,585,586],{},"npx -y @open-pets/cli@latest configure --agent cursor --rules-only --force\nnpx -y @open-pets/cli@latest configure --agent cursor --pet \u003Cpet-id> --with-rules --force",[156,588,31,589,31,595,31,600,31,603,16],{},[159,590,591,592,88],{},"MCP replacement touches only ",[73,593,594],{},"mcpServers.openpets",[159,596,597,598,88],{},"Rules replacement touches only ",[73,599,490],{},[159,601,602],{},"Backups are created before any replace or remove operation.",[159,604,605,608],{},[73,606,607],{},"--with-rules"," preflights MCP and rules together so a half-applied setup is avoided.",[11,610,16,613,16,616,16,622,16,638],{"id":611,"className":612},"pet-routing",[15],[18,614,615],{"id":611},"Pet routing",[23,617,618,619,621],{},"\n    Without a selected pet, Cursor targets the OpenPets desktop default pet.\n    With a selected pet, OpenPets adds ",[73,620,340],{}," to the MCP\n    command so Cursor targets that companion.\n  ",[27,623,31,625,31,633,16],{"className":624},[317],[27,626,628,631],{"className":627},[321],[323,629,630],{},"Runtime path",[323,632,472],{},[330,634,635],{},[73,636,637],{},"Cursor\n  -> OpenPets MCP server (@open-pets/mcp)\n  -> @open-pets/client\n  -> OpenPets desktop local IPC\n  -> default pet or selected agent pet",[156,639,31,640,31,643,31,648,31,651,16],{},[159,641,642],{},"No selected pet: MCP targets the desktop default pet.",[159,644,645,646,88],{},"Selected pet: the MCP args include ",[73,647,340],{},[159,649,650],{},"Explicit pet sessions use short leases so agent pets clean up automatically.",[159,652,653],{},"If a requested pet is missing or unavailable, OpenPets falls back safely instead of breaking Cursor.",[11,655,16,658,16,662,16,666,16,669,16,688,16,691,16,695,16,698,16,717],{"id":656,"className":657},"caveats",[15],[18,659,661],{"id":660},"cursor-behavior-and-caveats","Cursor behavior and caveats",[252,663,665],{"id":664},"restart-reload-or-new-chat","Restart, reload, or new chat",[23,667,668],{},"\n    Cursor MCP loading varies by version and environment. If OpenPets tools do\n    not appear after install:\n  ",[670,671,31,672,31,675,31,678,31,681,16],"ol",{},[159,673,674],{},"Start a new Cursor chat.",[159,676,677],{},"Reload the Cursor window.",[159,679,680],{},"Fully restart Cursor.",[159,682,683,684,687],{},"Verify Node and npm can run the configured ",[73,685,686],{},"npx"," command.",[23,689,690],{},"\n    Rules are included as chat context, so changed rules may also need a new or\n    refreshed chat to be picked up.\n  ",[252,692,694],{"id":693},"wsl-remote-and-devcontainer","WSL, remote, and devcontainer",[23,696,697],{},"\n    OpenPets desktop runs on the local OS and the MCP server reaches the\n    desktop over local IPC. If Cursor runs MCP commands inside WSL, a remote\n    host, or a devcontainer, the command may run somewhere that cannot reach\n    the desktop app.\n  ",[156,699,31,700,31,703,31,708,16],{},[159,701,702],{},"Cursor may show MCP connection failures.",[159,704,705,707],{},[73,706,75],{}," may report the desktop as unreachable.",[159,709,710,711,566,713,716],{},"The configured ",[73,712,686],{},[73,714,715],{},"node"," command may exist in one environment but not the one Cursor uses.",[23,718,719],{},"\n    Workarounds depend on the environment. OpenPets does not currently write\n    WSL or devcontainer-specific MCP entries automatically.\n  ",[11,721,16,724,16,728,16,731],{"id":722,"className":723},"safety",[15],[18,725,727],{"id":726},"safety-and-behavior","Safety and behavior",[23,729,730],{},"\n    OpenPets treats Cursor config as user-owned. MCP and rules edits are\n    scoped, audited, and reversible.\n  ",[27,732,31,734,16],{"className":733},[30],[33,735,35,736,35,746,31],{},[37,737,738],{},[41,739,740,743],{},[44,741,742],{},"Protection",[44,744,745],{},"Behavior",[54,747,39,748,39,759,39,773,39,781,39,789,39,797,39,805,39,813,39,821,35],{},[41,749,750,753],{},[60,751,752],{},"Scoped MCP edits",[60,754,755,756,758],{},"Only ",[73,757,594],{}," is read, written, replaced, or removed; unrelated servers and fields are preserved.",[41,760,761,764],{},[60,762,763],{},"Scoped rules edits",[60,765,755,766,768,769,772],{},[73,767,490],{}," is touched. Other rule files and the ",[73,770,771],{},".cursor"," directory itself are left in place.",[41,774,775,778],{},[60,776,777],{},"Strict JSON",[60,779,780],{},"MCP config is read as strict JSON. Files that do not parse are classified as invalid instead of being rewritten.",[41,782,783,786],{},[60,784,785],{},"Size limits",[60,787,788],{},"MCP config reads cap at 256 KiB. Rule reads cap at 64 KiB.",[41,790,791,794],{},[60,792,793],{},"Safe writes",[60,795,796],{},"Atomic temp-file writes with rename, plus backups before any replace or remove.",[41,798,799,802],{},[60,800,801],{},"Symlink rejection",[60,803,804],{},"Symlinked config files, non-regular files, unsafe parents, and dangling symlinks are refused.",[41,806,807,810],{},[60,808,809],{},"Managed detection",[60,811,812],{},"Rules are treated as managed only when the OpenPets frontmatter and exactly one ordered marker pair are present; user-authored files become conflicts, not overwrites.",[41,814,815,818],{},[60,816,817],{},"Preview redaction",[60,819,820],{},"The desktop preview shows only the OpenPets MCP entry; broader previews redact sensitive-looking fields.",[41,822,823,826],{},[60,824,825],{},"No broad permissions",[60,827,828,829,832],{},"OpenPets never writes ",[73,830,831],{},"~/.cursor/permissions.json"," or adds broad MCP/tool allowlists.",[11,834,16,837,16,840,16,844,16,866,16,870,16,884,16,888,16,891,16,907,16,911],{"id":835,"className":836},"troubleshooting",[15],[18,838,839],{"id":835},"Troubleshooting",[252,841,843],{"id":842},"cursor-does-not-show-openpets-tools","Cursor does not show OpenPets tools",[156,845,31,846,31,849,31,856,31,863,16],{},[159,847,848],{},"Start a new chat, reload the window, or fully restart Cursor.",[159,850,851,852,855],{},"Confirm OpenPets desktop is running and click ",[63,853,854],{},"Refresh"," on the Cursor detail panel.",[159,857,858,859,862],{},"Run ",[73,860,861],{},"npx -y @open-pets/mcp@latest --help"," in a terminal to confirm npm can resolve the package.",[159,864,865],{},"If Cursor runs in WSL, remote, or a devcontainer, see the caveats above.",[252,867,869],{"id":868},"openpets-reports-the-mcp-entry-as-custom-or-conflicted","OpenPets reports the MCP entry as custom or conflicted",[23,871,872,873,875,876,879,880,883],{},"\n    A custom or conflicted status means the existing ",[73,874,166],{},"\n    entry, the MCP config file, or the rule file does not match what OpenPets\n    manages. OpenPets leaves it alone. Use ",[63,877,878],{},"Replace"," in the\n    detail panel, or the ",[73,881,882],{},"--force"," CLI flag, only when you want\n    OpenPets to recreate its managed entry or file.\n  ",[252,885,887],{"id":886},"wrong-pet-appears","Wrong pet appears",[23,889,890],{},"\n    Re-run setup with the pet ID you want. If that pet is not installed,\n    invalid, or broken, the desktop app falls back to the default pet.\n  ",[27,892,31,894,31,902,16],{"className":893},[317],[27,895,897,900],{"className":896},[321],[323,898,899],{},"Refresh project setup",[323,901,364],{},[330,903,904],{},[73,905,906],{},"npx -y @open-pets/cli@latest configure --agent cursor --pet \u003Cpet-id> --cwd . --force",[252,908,910],{"id":909},"remove-or-reset","Remove or reset",[23,912,913,914,916],{},"\n    Remove the global MCP entry from the desktop detail panel. Remove the\n    project rule with ",[73,915,450],{},".\n    Both operations create backups before touching managed content.\n  ",[11,918,16,921,16,925],{"id":919,"className":920},"whats-next",[15],[18,922,924],{"id":923},"what-is-next","What is next",[23,926,927,928,931],{},"\n    Cursor MCP and project rules are complete. The next phase would be\n    ",[63,929,930],{},"Cursor hooks"," for ambient lifecycle reactions, similar to\n    Claude hooks or the OpenCode plugin event mapper. Hooks are intentionally\n    not written yet — they need a validation spike covering hook config paths,\n    payload schema, stdout behavior, timeouts, fail-open vs fail-closed\n    semantics, and execution location across local, WSL, remote, and\n    devcontainer setups.\n  ",{"title":933,"searchDepth":934,"depth":934,"links":935},"",2,[936,937,938,944,947,948,949,953,954,960],{"id":20,"depth":934,"text":21},{"id":131,"depth":934,"text":135},{"id":184,"depth":934,"text":188,"children":939},[940,942,943],{"id":254,"depth":941,"text":255},3,{"id":312,"depth":941,"text":313},{"id":351,"depth":941,"text":352},{"id":398,"depth":934,"text":399,"children":945},[946],{"id":480,"depth":941,"text":481},{"id":557,"depth":934,"text":558},{"id":611,"depth":934,"text":615},{"id":660,"depth":934,"text":661,"children":950},[951,952],{"id":664,"depth":941,"text":665},{"id":693,"depth":941,"text":694},{"id":726,"depth":934,"text":727},{"id":835,"depth":934,"text":839,"children":955},[956,957,958,959],{"id":842,"depth":941,"text":843},{"id":868,"depth":941,"text":869},{"id":886,"depth":941,"text":887},{"id":909,"depth":941,"text":910},{"id":923,"depth":934,"text":924},"Connect Cursor to OpenPets with global or project MCP setup, optional project rules, pet routing, managed safety, and conflict handling.","md","MCP + project rules",null,"/integrations/cursor.svg",{},4,"/integrations/cursor",{"title":5,"description":961},"cursor","Active","integrations/cursor","Connect Cursor to OpenPets with global or project MCP setup, optional project rules, and pet routing.","56H52XouYlzjSTN_AD2lQtbbVDJRJjEg7KEJZQaoDb0",1781359999929]