[{"data":1,"prerenderedAt":4245},["ShallowReactive",2],{"integrations-ja:index":3},[4,988,1795,2670,3283,3766,4160,4191,4218],{"id":5,"title":6,"active":7,"body":8,"description":977,"extension":378,"eyebrow":978,"icon":979,"image":980,"meta":981,"name":130,"navTitle":130,"navigation":7,"order":953,"path":982,"seo":983,"slug":332,"status":984,"stem":985,"summary":986,"toc":979,"__hash__":987},"integrations_en/integrations/claude.md","Claude Code + OpenPets",true,{"type":9,"value":10,"toc":951},"minimark",[11,114,183,346,477,734,781,857],[12,13,17,18,17,23,17,27,17,111],"section",{"id":14,"className":15},"overview",[16],"docs-section","\n  ",[19,20,22],"h2",{"id":21},"what-this-integration-does","What this integration does",[24,25,26],"p",{},"\n    The Claude Code integration connects Claude to your OpenPets desktop\n    companion. It has one basic install path and two advanced layers you can\n    inspect or customize later.\n  ",[28,29,32,33,17],"div",{"className":30},[31],"docs-table-wrap","\n    ",[34,35,36,37,36,54,32],"table",{},"\n      ",[38,39,40,41,36],"thead",{},"\n        ",[42,43,44,48,51],"tr",{},[45,46,47],"th",{},"Part",[45,49,50],{},"Required?",[45,52,53],{},"What it gives Claude",[55,56,40,57,40,86,40,98,36],"tbody",{},[42,58,59,60,59,67,59,70,40],{},"\n          ",[61,62,63],"td",{},[64,65,66],"strong",{},"MCP server",[61,68,69],{},"Yes",[61,71,72,73,77,78,81,82,85],{},"Tools named ",[74,75,76],"code",{},"openpets_status",", ",[74,79,80],{},"openpets_react",", and ",[74,83,84],{},"openpets_say",".",[42,87,59,88,59,93,59,95,40],{},[61,89,90],{},[64,91,92],{},"Instructions / prompt guidance",[61,94,69],{},[61,96,97],{},"Rules that tell Claude when to use OpenPets and what never to put in visible pet messages.",[42,99,59,100,59,105,59,108,40],{},[61,101,102],{},[64,103,104],{},"Hooks",[61,106,107],{},"Optional",[61,109,110],{},"Automatic reactions from Claude lifecycle events, even when Claude does not call an MCP tool.",[24,112,113],{},"\n    All runtime communication is local. Claude starts OpenPets packages, those\n    packages talk to the OpenPets desktop app over local IPC, and the desktop\n    app owns the pet window. If OpenPets is closed, Claude Code keeps working;\n    pet updates are best-effort feedback.\n  ",[12,115,17,118,17,121,17,136,17,151,17,176],{"id":116,"className":117},"quick-install",[16],[19,119,120],{"id":116},"Quick install",[24,122,123,124,127,128,131,132,135],{},"\n    In the OpenPets desktop app, open ",[64,125,126],{},"Integrations"," and use the\n    ",[64,129,130],{},"Claude Code"," card. This card is for the normal user flow:\n    click ",[64,133,134],{},"Install",", restart Claude Code if it was already open,\n    and Claude can start using the OpenPets MCP tools.\n  ",[137,138,32,141,32,147,17],"figure",{"className":139},[140],"docs-screenshot",[142,143],"img",{"src":144,"alt":145,"loading":146},"/docs/claude-integrations-grid.png","OpenPets Integrations window showing the Claude Code card installed and other editor integration cards.","lazy",[148,149,150],"figcaption",{},"The integrations grid is the simple setup view. Install handles the Claude MCP connection and managed instructions; Configure opens advanced details.",[152,153,32,154,32,164,32,170,17],"ul",{},[155,156,157,159,160,163],"li",{},[64,158,134],{}," adds the Claude MCP server named ",[74,161,162],{},"openpets"," and updates OpenPets Claude instructions.",[155,165,166,169],{},[64,167,168],{},"Configure"," opens advanced MCP, instruction, hook, pet routing, and command detection controls.",[155,171,172,175],{},[64,173,174],{},"Installed"," means Claude already has an OpenPets MCP connection.",[24,177,178,179,182],{},"\n    Quick install does ",[64,180,181],{},"not"," install hooks. Hooks are intentionally\n    separate because they modify Claude Code hook settings and add automatic\n    reactions to Claude events.\n  ",[12,184,17,187,17,190,17,196,17,206,17,262,17,265,17,286,17,289,17,306,17,311],{"id":185,"className":186},"mcp-connection",[16],[19,188,189],{"id":185},"MCP connection",[24,191,192,193,195],{},"\n    MCP is the main Claude-to-OpenPets bridge. OpenPets registers a Claude MCP\n    server named ",[74,194,162],{},". After Claude loads it, Claude can call a\n    small safe tool set whenever it wants to show status on your desktop pet.\n  ",[137,197,32,199,32,203,17],{"className":198},[140],[142,200],{"src":201,"alt":202,"loading":146},"/docs/claude-connection-advanced.png","Claude Code detail page showing connection status, pet routing, advanced detection, replace and remove actions, and the advanced MCP details section.",[148,204,205],{},"The MCP connection card shows Claude detection, pet routing, replace/remove controls, and the advanced MCP command and JSON preview.",[28,207,32,209,17],{"className":208},[31],[34,210,36,211,36,224,32],{},[38,212,40,213,36],{},[42,214,215,218,221],{},[45,216,217],{},"Tool",[45,219,220],{},"Purpose",[45,222,223],{},"When Claude should use it",[55,225,40,226,40,238,40,250,36],{},[42,227,59,228,59,232,59,235,40],{},[61,229,230],{},[74,231,76],{},[61,233,234],{},"Checks whether the OpenPets desktop app is reachable and which pet is targeted.",[61,236,237],{},"Before using OpenPets, or when debugging setup.",[42,239,59,240,59,244,59,247,40],{},[61,241,242],{},[74,243,80],{},[61,245,246],{},"Changes the pet reaction without showing text.",[61,248,249],{},"For silent state changes like thinking, editing, testing, waiting, success, or error.",[42,251,59,252,59,256,59,259,40],{},[61,253,254],{},[74,255,84],{},[61,257,258],{},"Shows one short visible speech bubble.",[61,260,261],{},"For meaningful progress, blockers, completion, or review handoff.",[24,263,264],{},"\n    In a packaged desktop build, the advanced MCP JSON preview uses the bundled\n    OpenPets MCP server inside the app:\n  ",[28,266,32,269,32,280,17],{"className":267},[268],"docs-code",[28,270,273,277],{"className":271},[272],"docs-code-bar",[274,275,276],"span",{},"Claude MCP JSON preview",[274,278,279],{},"json",[281,282,283],"pre",{},[74,284,285],{},"{\n  \"mcpServers\": {\n    \"openpets\": {\n      \"type\": \"stdio\",\n      \"command\": \"node\",\n      \"args\": [\n        \"/Applications/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@open-pets/mcp/dist/index.js\"\n      ]\n    }\n  }\n}",[24,287,288],{},"\n    In published-package mode, the command is shorter and uses npm:\n  ",[28,290,32,292,32,301,17],{"className":291},[268],[28,293,295,298],{"className":294},[272],[274,296,297],{},"Published command",[274,299,300],{},"bash",[281,302,303],{},[74,304,305],{},"claude mcp add --scope user openpets -- npx -y @open-pets/mcp@latest --pet \u003Cpet-id>",[307,308,310],"h3",{"id":309},"customization-ideas","Customization ideas",[152,312,32,313,32,323,32,334,32,343,17],{},[155,314,315,316,319,320,85],{},"Select a specific pet in ",[64,317,318],{},"Pet routing"," to append ",[74,321,322],{},"--pet \u003Cpet-id>",[155,324,325,326,329,330,333],{},"Use ",[64,327,328],{},"Advanced detection"," if the ",[74,331,332],{},"claude"," command is not on PATH.",[155,335,325,336,339,340,342],{},[64,337,338],{},"Replace configuration"," only when you want OpenPets to recreate a custom ",[74,341,162],{}," MCP entry.",[155,344,345],{},"Use the JSON preview if you want to audit exactly what Claude will run.",[12,347,17,350,17,354,17,357,17,368,17,384,17,399,17,403,17,460,17,463],{"id":348,"className":349},"instructions-prompt",[16],[19,351,353],{"id":352},"claude-instructions-prompt-guidance","Claude instructions / prompt guidance",[24,355,356],{},"\n    MCP gives Claude the tools. Instructions tell Claude how to use those tools\n    without leaking private context into a visible desktop bubble. This is why\n    basic install writes a managed OpenPets instruction file.\n  ",[24,358,359,360,363,364,367],{},"\n    OpenPets writes its guidance to ",[74,361,362],{},"~/.claude/openpets.md"," and adds\n    one managed import to ",[74,365,366],{},"~/.claude/CLAUDE.md",". Existing Claude\n    instructions are preserved.\n  ",[28,369,32,371,32,379,17],{"className":370},[268],[28,372,374,376],{"className":373},[272],[274,375,366],{},[274,377,378],{},"md",[281,380,381],{},[74,382,383],{},"\u003C!-- OPENPETS:IMPORT:START -->\n@~/.claude/openpets.md\n\u003C!-- OPENPETS:IMPORT:END -->",[28,385,32,387,32,394],{"className":386},[268],[28,388,390,392],{"className":389},[272],[274,391,362],{},[274,393,378],{},[281,395,396],{},[74,397,398],{},"\u003C!-- OPENPETS:START -->\n## OpenPets\nOpenPets MCP tools may be available.\nUse OpenPets as a short visible status channel for meaningful coding progress:\n    - Use `openpets_say` when starting, completing, blocking, or needing review on non-trivial work.\n    - Keep messages brief, user-facing, and non-sensitive.\n    - Do not include code, logs, secrets, URLs, or file paths.\n    - Use `openpets_react` for small visual or emotional feedback.\n    - Use `openpets_status` only when checking availability or the targeted pet.\n    - Do not spam every internal step.\n\u003C!-- OPENPETS:END -->",[307,400,402],{"id":401},"message-style","Message style",[28,404,32,406,17],{"className":405},[31],[34,407,36,408,36,418,32],{},[38,409,40,410,36],{},[42,411,412,415],{},[45,413,414],{},"Good pet message",[45,416,417],{},"Avoid",[55,419,40,420,40,430,40,440,40,450,36],{},[42,421,422,427],{},[61,423,424],{},[74,425,426],{},"Checking the next step.",[61,428,429],{},"Private file paths or repo structure.",[42,431,432,437],{},[61,433,434],{},[74,435,436],{},"Tests are running.",[61,438,439],{},"Raw command output or logs.",[42,441,442,447],{},[61,443,444],{},[74,445,446],{},"Waiting for approval.",[61,448,449],{},"User prompts, secrets, tokens, or URLs.",[42,451,452,457],{},[61,453,454],{},[74,455,456],{},"Ready with the result.",[61,458,459],{},"Code snippets or exact stack traces.",[307,461,310],{"id":462},"customization-ideas-1",[152,464,32,465,32,471,32,474,17],{},[155,466,467,468,85],{},"Add your own team style rules outside the OpenPets managed block in ",[74,469,470],{},"CLAUDE.md",[155,472,473],{},"Keep the OpenPets block focused on privacy and short status messages.",[155,475,476],{},"If you remove OpenPets later, the managed import and managed block can be removed cleanly.",[12,478,17,481,17,485,17,488,17,498,17,651,17,658,17,662,17,665,17,694,17,697,17,713,17,716],{"id":479,"className":480},"hooks",[16],[19,482,484],{"id":483},"optional-claude-hooks","Optional Claude hooks",[24,486,487],{},"\n    Hooks are optional automation. They let Claude lifecycle events trigger pet\n    reactions without Claude explicitly calling an MCP tool. Install them only\n    if you want the pet to react automatically while Claude works.\n  ",[137,489,32,491,32,495,17],{"className":490},[140],[142,492],{"src":493,"alt":494,"loading":146},"/docs/claude-instructions-hooks.png","Claude Code detail page showing the included Claude instructions card and optional Claude hooks card.",[148,496,497],{},"The hooks card is separate from basic install. It installs, checks, removes, and previews the Claude hook JSON.",[28,499,32,501,17],{"className":500},[31],[34,502,36,503,36,519,32],{},[38,504,40,505,36],{},[42,506,507,510,513,516],{},[45,508,509],{},"Claude event",[45,511,512],{},"When it fires",[45,514,515],{},"Pet reaction",[45,517,518],{},"Speech",[55,520,40,521,40,539,40,565,40,584,40,602,40,616,40,633,36],{},[42,522,523,528,531,536],{},[61,524,525],{},[74,526,527],{},"UserPromptSubmit",[61,529,530],{},"User submits a prompt.",[61,532,533],{},[74,534,535],{},"thinking",[61,537,538],{},"None",[42,540,541,546,558,563],{},[61,542,543],{},[74,544,545],{},"PreToolUse",[61,547,548,77,551,554,555,85],{},[74,549,550],{},"Edit",[74,552,553],{},"Write",", or ",[74,556,557],{},"MultiEdit",[61,559,560],{},[74,561,562],{},"editing",[61,564,538],{},[42,566,567,571,577,582],{},[61,568,569],{},[74,570,545],{},[61,572,573,576],{},[74,574,575],{},"Bash"," command looks test-like.",[61,578,579],{},[74,580,581],{},"testing",[61,583,538],{},[42,585,586,591,594,599],{},[61,587,588],{},[74,589,590],{},"PermissionRequest",[61,592,593],{},"Claude asks for approval.",[61,595,596],{},[74,597,598],{},"waiting",[61,600,601],{},"Short approval message",[42,603,604,609,612,614],{},[61,605,606],{},[74,607,608],{},"Notification",[61,610,611],{},"Claude emits a notification.",[61,613,538],{},[61,615,538],{},[42,617,618,623,626,631],{},[61,619,620],{},[74,621,622],{},"Stop",[61,624,625],{},"Claude finishes a response.",[61,627,628],{},[74,629,630],{},"success",[61,632,538],{},[42,634,635,640,643,648],{},[61,636,637],{},[74,638,639],{},"StopFailure",[61,641,642],{},"Claude finalization fails.",[61,644,645],{},[74,646,647],{},"error",[61,649,650],{},"Short error message",[24,652,653,654,657],{},"\n    Hook commands are marked with ",[74,655,656],{},"--openpets-managed",". OpenPets uses\n    that marker to update or remove only its own hooks while leaving unrelated\n    Claude Code hooks alone.\n  ",[307,659,661],{"id":660},"lifecycle-status-bubbles","Lifecycle status bubbles",[24,663,664],{},"\n    When hooks are installed, OpenPets can add a compact status header to the\n    pet bubble. Status-only events show a small colored pill, while approval or\n    error messages can show the status row, a divider, and the message in one\n    unified bubble.\n  ",[152,666,32,667,32,673,32,679,32,687,17],{},[155,668,669,672],{},[64,670,671],{},"Working status"," appears for prompt, edit, and test activity.",[155,674,675,678],{},[64,676,677],{},"Waiting status"," appears when Claude asks for approval.",[155,680,681,684,685,85],{},[64,682,683],{},"Done status"," appears when Claude sends ",[74,686,622],{},[155,688,689,684,692,85],{},[64,690,691],{},"Error status",[74,693,639],{},[24,695,696],{},"\n    Hook status is best-effort local feedback. Claude Code continues normally\n    if OpenPets is closed, hook events are throttled to avoid spam, and speech\n    remains privacy-scoped by the same message validation rules.\n  ",[28,698,32,700,32,708,17],{"className":699},[268],[28,701,703,706],{"className":702},[272],[274,704,705],{},"Hooks JSON preview",[274,707,279],{},[281,709,710],{},[74,711,712],{},"{\n  \"hooks\": {\n    \"UserPromptSubmit\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"node /Applications/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@open-pets/claude/dist/cli.js hook --openpets-managed\",\n            \"timeout\": 3,\n            \"async\": true,\n            \"asyncRewake\": false\n          }\n        ]\n      }\n    ],\n    \"PreToolUse\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"node /Applications/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@open-pets/claude/dist/cli.js hook --openpets-managed\",\n            \"timeout\": 3,\n            \"async\": true,\n            \"asyncRewake\": false\n          }\n        ]\n      }\n    ],\n    \"PermissionRequest\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"node /Applications/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@open-pets/claude/dist/cli.js hook --openpets-managed\",\n            \"timeout\": 3,\n            \"async\": true,\n            \"asyncRewake\": false\n          }\n        ]\n      }\n    ],\n    \"Notification\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"node /Applications/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@open-pets/claude/dist/cli.js hook --openpets-managed\",\n            \"timeout\": 3,\n            \"async\": true,\n            \"asyncRewake\": false\n          }\n        ]\n      }\n    ],\n    \"Stop\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"node /Applications/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@open-pets/claude/dist/cli.js hook --openpets-managed\",\n            \"timeout\": 3,\n            \"async\": true,\n            \"asyncRewake\": false\n          }\n        ]\n      }\n    ],\n    \"StopFailure\": [\n      {\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"node /Applications/OpenPets.app/Contents/Resources/app.asar.unpacked/node_modules/@open-pets/claude/dist/cli.js hook --openpets-managed\",\n            \"timeout\": 3,\n            \"async\": true,\n            \"asyncRewake\": false\n          }\n        ]\n      }\n    ]\n  }\n}",[307,714,310],{"id":715},"customization-ideas-2",[152,717,32,718,32,721,32,724,32,727,17],{},[155,719,720],{},"Use hooks when you want ambient reactions for every Claude session.",[155,722,723],{},"Skip hooks if you only want Claude to use OpenPets intentionally through MCP tools.",[155,725,726],{},"Choose a pet in routing before installing hooks if you want hook events to target a specific companion.",[155,728,729,730,733],{},"Run ",[64,731,732],{},"Check hooks"," after updating Claude Code or moving the OpenPets app.",[12,735,17,738,17,742,17,748,17,765],{"id":736,"className":737},"pet-targeting",[16],[19,739,741],{"id":740},"pet-routing-and-customization","Pet routing and customization",[24,743,744,745,747],{},"\n    Without a selected pet, Claude targets the OpenPets default pet. With a\n    selected pet, OpenPets adds ",[74,746,322],{}," to the MCP and hook\n    commands so Claude targets that companion.\n  ",[28,749,32,751,32,760,17],{"className":750},[268],[28,752,754,757],{"className":753},[272],[274,755,756],{},"Runtime path",[274,758,759],{},"text",[281,761,762],{},[74,763,764],{},"Claude Code\n  -> OpenPets MCP server or Claude hook CLI\n  -> @open-pets/client\n  -> OpenPets desktop local IPC\n  -> default pet or selected agent pet",[152,766,32,767,32,770,32,775,32,778,17],{},[155,768,769],{},"No selected pet: MCP tools and hooks target the desktop default pet.",[155,771,772,773,85],{},"Selected pet: commands include ",[74,774,322],{},[155,776,777],{},"Explicit pet sessions use short leases so agent pets clean up automatically.",[155,779,780],{},"If a requested pet is missing or unavailable, OpenPets falls back safely instead of breaking Claude.",[12,782,17,785,17,789,17,792],{"id":783,"className":784},"safety",[16],[19,786,788],{"id":787},"safety-and-behavior","Safety and behavior",[24,790,791],{},"\n    OpenPets is designed for visible status, not private transcript output.\n    It keeps messages small, avoids sensitive content, and makes hook failures\n    non-blocking.\n  ",[28,793,32,795,17],{"className":794},[31],[34,796,36,797,36,807,32],{},[38,798,799],{},[42,800,801,804],{},[45,802,803],{},"Protection",[45,805,806],{},"Behavior",[55,808,40,809,40,817,40,825,40,833,40,841,40,849,36],{},[42,810,811,814],{},[61,812,813],{},"Managed instructions",[61,815,816],{},"Tell Claude to avoid code, logs, URLs, file paths, secrets, and user prompts in pet speech.",[42,818,819,822],{},[61,820,821],{},"Speech validation",[61,823,824],{},"Rejects unsafe-looking text before it reaches the desktop pet.",[42,826,827,830],{},[61,828,829],{},"Hook stdout",[61,831,832],{},"Hook commands stay quiet so Claude does not ingest accidental context.",[42,834,835,838],{},[61,836,837],{},"Hook errors",[61,839,840],{},"Ignored by default so pet issues do not break Claude sessions.",[42,842,843,846],{},[61,844,845],{},"Cooldowns",[61,847,848],{},"Repeated hook speech and reactions are throttled to avoid spam.",[42,850,851,854],{},[61,852,853],{},"Safe writes",[61,855,856],{},"OpenPets refuses unsafe symlink or non-regular file targets before editing Claude files.",[12,858,17,861,17,864,17,868,17,900,17,904,17,913,17,917,17,933,17,937],{"id":859,"className":860},"troubleshooting",[16],[19,862,863],{"id":859},"Troubleshooting",[307,865,867],{"id":866},"claude-does-not-show-openpets-tools","Claude does not show OpenPets tools",[152,869,32,870,32,873,32,879,32,885,32,895,17],{},[155,871,872],{},"Restart Claude Code after installing or replacing MCP configuration.",[155,874,875,876,85],{},"Open the Claude detail page and click ",[64,877,878],{},"Refresh",[155,880,729,881,884],{},[74,882,883],{},"claude --version"," in a terminal to confirm Claude is available.",[155,886,887,888,891,892,85],{},"Inspect the entry with ",[74,889,890],{},"claude mcp list"," and ",[74,893,894],{},"claude mcp get openpets",[155,896,897,898,85],{},"If Claude is installed in a custom location, add its full path under ",[64,899,328],{},[307,901,903],{"id":902},"openpets-says-the-mcp-entry-is-custom","OpenPets says the MCP entry is custom",[24,905,906,907,909,910,912],{},"\n    A custom entry means Claude already has a server named ",[74,908,162],{},",\n    but its command does not exactly match the current OpenPets recommendation.\n    OpenPets leaves it alone. Choose ",[64,911,338],{}," only\n    if you want the desktop app to recreate it.\n  ",[307,914,916],{"id":915},"the-pet-does-not-react-to-hooks","The pet does not react to hooks",[152,918,32,919,32,922,32,925,32,930,17],{},[155,920,921],{},"Confirm the OpenPets desktop app is running.",[155,923,924],{},"Confirm hooks are installed from the optional Claude hooks card.",[155,926,927,928,85],{},"Check that hook commands contain ",[74,929,656],{},[155,931,932],{},"Remember that most hook events are reaction-only and intentionally silent.",[307,934,936],{"id":935},"remove-or-reset-everything","Remove or reset everything",[24,938,939,940,943,944,946,947,950],{},"\n    Use ",[64,941,942],{},"Remove integration"," to remove the Claude MCP server named\n    ",[74,945,162],{}," and OpenPets-managed Claude instructions. Use\n    ",[64,948,949],{},"Remove hooks"," separately if you installed optional hooks.\n  ",{"title":952,"searchDepth":953,"depth":953,"links":954},"",2,[955,956,957,961,965,969,970,971],{"id":21,"depth":953,"text":22},{"id":116,"depth":953,"text":120},{"id":185,"depth":953,"text":189,"children":958},[959],{"id":309,"depth":960,"text":310},3,{"id":352,"depth":953,"text":353,"children":962},[963,964],{"id":401,"depth":960,"text":402},{"id":462,"depth":960,"text":310},{"id":483,"depth":953,"text":484,"children":966},[967,968],{"id":660,"depth":960,"text":661},{"id":715,"depth":960,"text":310},{"id":740,"depth":953,"text":741},{"id":787,"depth":953,"text":788},{"id":859,"depth":953,"text":863,"children":972},[973,974,975,976],{"id":866,"depth":960,"text":867},{"id":902,"depth":960,"text":903},{"id":915,"depth":960,"text":916},{"id":935,"depth":960,"text":936},"Install and understand the OpenPets Claude Code integration, including MCP setup, Claude instructions, optional hooks, pet routing, and advanced JSON previews.","Companion integration",null,"/claudecode.png",{},"/integrations/claude",{"title":6,"description":977},"Active","integrations/claude","Connect Claude Code to OpenPets with one-click MCP setup, managed instructions, pet routing, and optional lifecycle hooks.","SFvaAJmZRycnkKJTqnVw-NaMfTP2AQzgWIiKWfHJLHw",{"id":989,"title":990,"active":7,"body":991,"description":1786,"extension":378,"eyebrow":1787,"icon":979,"image":1788,"meta":1789,"name":1081,"navTitle":1081,"navigation":7,"order":960,"path":1790,"seo":1791,"slug":1187,"status":984,"stem":1792,"summary":1793,"toc":979,"__hash__":1794},"integrations_en/integrations/opencode.md","OpenCode + OpenPets",{"type":9,"value":992,"toc":1764},[993,1070,1117,1226,1304,1388,1526,1593,1631,1702],[12,994,17,996,17,998,17,1001,17,1063],{"id":14,"className":995},[16],[19,997,22],{"id":21},[24,999,1000],{},"\n    The OpenCode integration connects OpenCode activity to your OpenPets\n    desktop companion. It has two pieces: an OpenCode plugin for automatic\n    reactions, and an MCP server for intentional OpenPets tool calls.\n  ",[28,1002,32,1004,17],{"className":1003},[31],[34,1005,36,1006,36,1018,32],{},[38,1007,40,1008,36],{},[42,1009,1010,1012,1015],{},[45,1011,47],{},[45,1013,1014],{},"What it does",[45,1016,1017],{},"Why it matters",[55,1019,40,1020,40,1033,40,1051,36],{},[42,1021,59,1022,59,1027,59,1030,40],{},[61,1023,1024],{},[64,1025,1026],{},"OpenCode plugin",[61,1028,1029],{},"Listens to OpenCode activity and maps useful events to pet reactions.",[61,1031,1032],{},"The pet can think, edit, test, wait, succeed, or show errors automatically.",[42,1034,59,1035,59,1039,59,1042,40],{},[61,1036,1037],{},[64,1038,66],{},[61,1040,1041],{},"Registers OpenPets MCP tools with OpenCode.",[61,1043,1044,1045,77,1047,81,1049,85],{},"OpenCode can intentionally call ",[74,1046,76],{},[74,1048,80],{},[74,1050,84],{},[42,1052,59,1053,59,1057,59,1060,40],{},[61,1054,1055],{},[64,1056,813],{},[61,1058,1059],{},"Adds short safety guidance for OpenPets usage.",[61,1061,1062],{},"OpenCode knows to keep visible pet messages brief and non-sensitive.",[24,1064,1065,1066,1069],{},"\n    Runtime control is local. OpenCode loads the OpenPets plugin or MCP command,\n    those packages use ",[74,1067,1068],{},"@open-pets/client",", and the OpenPets desktop\n    app updates the pet window over local IPC.\n  ",[12,1071,17,1073,17,1075,17,1089,17,1099,17,1114],{"id":116,"className":1072},[16],[19,1074,120],{"id":116},[24,1076,123,1077,127,1079,1082,1083,1085,1086,1088],{},[64,1078,126],{},[64,1080,1081],{},"OpenCode"," card. The card is the simple setup path for one\n    machine: click ",[64,1084,134],{}," to write global OpenCode setup, or\n    click ",[64,1087,168],{}," to inspect the details first.\n  ",[137,1090,32,1092,32,1096,17],{"className":1091},[140],[142,1093],{"src":1094,"alt":1095,"loading":146},"/docs/opencode-integrations-grid.png","OpenPets Integrations window showing the OpenCode card ready to install.",[148,1097,1098],{},"The integrations grid. OpenCode is active and ready; Install starts global setup, while Configure opens the detailed setup panel.",[152,1100,32,1101,32,1106,32,1111,17],{},[155,1102,1103,1105],{},[64,1104,134],{}," writes global OpenCode config for the plugin, MCP server, and OpenPets instructions.",[155,1107,1108,1110],{},[64,1109,168],{}," opens the detailed global setup page with pet routing, command detection, install/remove, refresh, and config preview.",[155,1112,1113],{},"Restart OpenCode after setup changes so plugin and MCP config are loaded.",[24,1115,1116],{},"\n    Desktop setup is global. It can affect every OpenCode project on that\n    machine. For repository-specific setup, use the project-local CLI command\n    instead.\n  ",[12,1118,17,1121,17,1125,17,1128,17,1138,17,1203,17,1210,17,1212],{"id":1119,"className":1120},"global-setup",[16],[19,1122,1124],{"id":1123},"global-desktop-setup","Global desktop setup",[24,1126,1127],{},"\n    The OpenCode detail panel manages global setup only. It detects OpenCode,\n    shows whether OpenPets global config is installed, lets you choose a pet,\n    and previews the JSON before writing anything.\n  ",[137,1129,32,1131,32,1135,17],{"className":1130},[140],[142,1132],{"src":1133,"alt":1134,"loading":146},"/docs/opencode-global-setup.png","OpenCode setup detail page showing global setup status, pet routing, advanced detection, install and remove buttons, and config preview.",[148,1136,1137],{},"The global setup panel. Use it to inspect the target config file, selected pet, command path, and JSON preview before installing.",[28,1139,32,1141,17],{"className":1140},[31],[34,1142,36,1143,36,1155,32],{},[38,1144,40,1145,36],{},[42,1146,1147,1150,1152],{},[45,1148,1149],{},"Panel area",[45,1151,220],{},[45,1153,1154],{},"What it changes",[55,1156,40,1157,40,1168,40,1178,40,1192,36],{},[42,1158,59,1159,59,1162,59,1165,40],{},[61,1160,1161],{},"Global connection",[61,1163,1164],{},"Shows whether OpenCode is detected and whether global OpenPets setup is installed, ready, custom, conflicted, or errored.",[61,1166,1167],{},"Reads OpenCode command status and global OpenCode config files.",[42,1169,59,1170,59,1172,59,1175,40],{},[61,1171,318],{},[61,1173,1174],{},"Chooses which installed pet OpenCode should target.",[61,1176,1177],{},"Adds the pet ID to plugin options and the MCP command.",[42,1179,59,1180,59,1182,59,1189,40],{},[61,1181,328],{},[61,1183,1184,1185,1188],{},"Lets you save a full OpenCode command path if ",[74,1186,1187],{},"opencode"," is not on PATH.",[61,1190,1191],{},"Used for detection and setup checks.",[42,1193,59,1194,59,1197,59,1200,40],{},[61,1195,1196],{},"Preview",[61,1198,1199],{},"Shows config file, instruction file, cleanup paths, and JSON preview.",[61,1201,1202],{},"Lets you audit the planned global config before installation.",[24,1204,1205,1206,1209],{},"\n    OpenCode may need npm or network access to load the published\n    ",[74,1207,1208],{},"@open-pets/opencode"," plugin unless it is already cached or\n    installed locally.\n  ",[307,1211,310],{"id":309},[152,1213,32,1214,32,1217,32,1220,32,1223,17],{},[155,1215,1216],{},"Use global setup when you want OpenPets available in every OpenCode project.",[155,1218,1219],{},"Select a pet before installing if you want all global OpenCode activity to target one companion.",[155,1221,1222],{},"Use the config preview to confirm exactly which file will be written.",[155,1224,1225],{},"Use the command path field if your OpenCode binary is installed outside normal PATH locations.",[12,1227,17,1230,17,1233,17,1236,17,1252,17,1301],{"id":1228,"className":1229},"project-local-setup",[16],[19,1231,1232],{"id":1228},"Project-local setup",[24,1234,1235],{},"\n    Project-local setup is better when a repository should own its OpenPets\n    configuration. It keeps plugin config and instructions in the project, so\n    different repos can target different pets or policies.\n  ",[28,1237,32,1239,32,1247,17],{"className":1238},[268],[28,1240,1242,1245],{"className":1241},[272],[274,1243,1244],{},"Project setup",[274,1246,300],{},[281,1248,1249],{},[74,1250,1251],{},"npx -y @open-pets/cli@latest configure --agent opencode --pet \u003Cpet-id> --cwd .",[28,1253,32,1255,17],{"className":1254},[31],[34,1256,36,1257,36,1270,32],{},[38,1258,40,1259,36],{},[42,1260,1261,1264,1267],{},[45,1262,1263],{},"Setup style",[45,1265,1266],{},"Best for",[45,1268,1269],{},"Files",[55,1271,40,1272,40,1285,36],{},[42,1273,59,1274,59,1276,59,1279,40],{},[61,1275,1124],{},[61,1277,1278],{},"Personal machine-wide OpenCode setup.",[61,1280,1281,1282,85],{},"OpenCode config directory, such as ",[74,1283,1284],{},"~/.config/opencode/",[42,1286,59,1287,59,1290,59,1293,40],{},[61,1288,1289],{},"Project-local CLI setup",[61,1291,1292],{},"Repos that should explicitly carry OpenPets setup.",[61,1294,1295,891,1298,85],{},[74,1296,1297],{},".opencode/opencode.jsonc",[74,1299,1300],{},".opencode/openpets.md",[24,1302,1303],{},"\n    If both global and project setup exist, prefer the project-local config for\n    repository-specific behavior and use global setup only as a default.\n  ",[12,1305,17,1308,17,1312,17,1315,17,1319,17,1322,17,1337,17,1347,17,1351,17,1354,17,1369,17,1371],{"id":1306,"className":1307},"managed-config",[16],[19,1309,1311],{"id":1310},"managed-config-and-instructions","Managed config and instructions",[24,1313,1314],{},"\n    OpenPets writes plugin, MCP, and instruction entries with managed markers\n    or predictable config shapes. It uses JSONC-aware edits where possible so\n    existing comments and trailing commas can be preserved.\n  ",[307,1316,1318],{"id":1317},"opencode-config","OpenCode config",[24,1320,1321],{},"\n    A project-local config loads the OpenPets plugin and starts the OpenPets\n    MCP server through the OpenPets CLI. Published setup pins the OpenPets\n    package versions it writes.\n  ",[28,1323,32,1325,32,1332,17],{"className":1324},[268],[28,1326,1328,1330],{"className":1327},[272],[274,1329,1297],{},[274,1331,279],{},[281,1333,1334],{},[74,1335,1336],{},"{\n  \"plugin\": [[\"@open-pets/opencode@\u003Cversion>\", { \"pet\": \"\u003Cpet-id>\" }]],\n  \"mcp\": {\n    \"openpets\": {\n      \"type\": \"local\",\n      \"command\": [\n        \"npx\",\n        \"-y\",\n        \"@open-pets/cli@\u003Cversion>\",\n        \"mcp\",\n        \"--pet\",\n        \"\u003Cpet-id>\"\n      ],\n      \"enabled\": true\n    }\n  }\n}",[24,1338,1339,1340,1342,1343,1346],{},"\n    The npm plugin package is ",[74,1341,1208],{},". The runtime\n    plugin ID exported by that package is ",[74,1344,1345],{},"open-pets-opencode",".\n  ",[307,1348,1350],{"id":1349},"openpets-instructions","OpenPets instructions",[24,1352,1353],{},"\n    OpenPets writes a small instruction file so OpenCode uses visible pet\n    messages safely and sparingly. Keep your own notes outside the managed\n    block.\n  ",[28,1355,32,1357,32,1364,17],{"className":1356},[268],[28,1358,1360,1362],{"className":1359},[272],[274,1361,1300],{},[274,1363,378],{},[281,1365,1366],{},[74,1367,1368],{},"\u003C!-- OPENPETS:START -->\n## OpenPets\nOpenPets MCP tools may be available.\nUse OpenPets as a short visible status channel for meaningful coding progress:\n- Use openpets_say only for brief, user-facing, non-sensitive status updates.\n- Do not include code, logs, secrets, URLs, file paths, prompts, or private data.\n- Use openpets_react for small visual progress changes.\n- Use openpets_status only when checking availability or the targeted pet.\n- Do not spam every internal step.\n\u003C!-- OPENPETS:END -->",[307,1370,310],{"id":462},[152,1372,32,1373,32,1376,32,1382,17],{},[155,1374,1375],{},"Add project-specific OpenCode rules outside the OpenPets managed block.",[155,1377,1378,1379,85],{},"Pin a pet per repository by rerunning setup with a different ",[74,1380,1381],{},"--pet",[155,1383,325,1384,1387],{},[74,1385,1386],{},"--force"," only when you intentionally want to refresh managed OpenPets entries.",[12,1389,17,1392,17,1396,17,1399,17,1523],{"id":1390,"className":1391},"plugin-events",[16],[19,1393,1395],{"id":1394},"plugin-event-reactions","Plugin event reactions",[24,1397,1398],{},"\n    The plugin listens to OpenCode events and turns useful moments into pet\n    reactions. It ignores OpenPets MCP tools so the pet does not react to its\n    own status updates.\n  ",[28,1400,32,1402,17],{"className":1401},[31],[34,1403,36,1404,36,1419,32],{},[38,1405,40,1406,36],{},[42,1407,1408,1411,1414,1417],{},[45,1409,1410],{},"OpenCode event",[45,1412,1413],{},"Condition",[45,1415,1416],{},"Reaction",[45,1418,518],{},[55,1420,40,1421,40,1437,40,1453,40,1468,40,1487,40,1504,36],{},[42,1422,1423,1428,1431,1435],{},[61,1424,1425],{},[74,1426,1427],{},"chat.message",[61,1429,1430],{},"Any chat message.",[61,1432,1433],{},[74,1434,535],{},[61,1436,538],{},[42,1438,1439,1444,1447,1451],{},[61,1440,1441],{},[74,1442,1443],{},"tool.execute.before",[61,1445,1446],{},"Tool name contains edit, write, patch, or apply_patch.",[61,1448,1449],{},[74,1450,562],{},[61,1452,538],{},[42,1454,1455,1459,1462,1466],{},[61,1456,1457],{},[74,1458,1443],{},[61,1460,1461],{},"Shell-like tool with test-like args.",[61,1463,1464],{},[74,1465,581],{},[61,1467,538],{},[42,1469,1470,1475,1478,1482],{},[61,1471,1472],{},[74,1473,1474],{},"permission.asked",[61,1476,1477],{},"Permission request for a non-OpenPets tool.",[61,1479,1480],{},[74,1481,598],{},[61,1483,1484],{},[74,1485,1486],{},"Approval needed",[42,1488,1489,1494,1497,1501],{},[61,1490,1491],{},[74,1492,1493],{},"session.error",[61,1495,1496],{},"OpenCode session error.",[61,1498,1499],{},[74,1500,647],{},[61,1502,1503],{},"Short error-pool message",[42,1505,1506,1511,1517,1521],{},[61,1507,1508],{},[74,1509,1510],{},"session.status",[61,1512,1513,1514,85],{},"Status becomes ",[74,1515,1516],{},"idle",[61,1518,1519],{},[74,1520,630],{},[61,1522,538],{},[24,1524,1525],{},"\n    Shell/test detection is intentionally coarse. Tool arguments are used only\n    to classify the reaction; they are not copied into speech bubbles.\n  ",[12,1527,17,1530,17,1533,17,1536,17,1590],{"id":1528,"className":1529},"mcp-tools",[16],[19,1531,1532],{"id":1528},"MCP tools",[24,1534,1535],{},"\n    The MCP server gives OpenCode a deliberate way to talk to OpenPets. Use\n    MCP when OpenCode should intentionally show status, not just react to\n    lifecycle events.\n  ",[28,1537,32,1539,17],{"className":1538},[31],[34,1540,36,1541,36,1552,32],{},[38,1542,40,1543,36],{},[42,1544,1545,1547,1549],{},[45,1546,217],{},[45,1548,220],{},[45,1550,1551],{},"Use it for",[55,1553,40,1554,40,1566,40,1578,36],{},[42,1555,1556,1560,1563],{},[61,1557,1558],{},[74,1559,76],{},[61,1561,1562],{},"Checks desktop reachability and target pet.",[61,1564,1565],{},"Setup checks and debugging.",[42,1567,1568,1572,1575],{},[61,1569,1570],{},[74,1571,80],{},[61,1573,1574],{},"Changes reaction without speech.",[61,1576,1577],{},"Quiet progress states.",[42,1579,1580,1584,1587],{},[61,1581,1582],{},[74,1583,84],{},[61,1585,1586],{},"Shows one short safe message.",[61,1588,1589],{},"Meaningful progress, blockers, completion, or review handoff.",[24,1591,1592],{},"\n    Keep speech brief and non-sensitive. Do not put code, logs, file paths,\n    command output, prompts, URLs, tokens, or private data in pet bubbles.\n  ",[12,1594,17,1596,17,1599,17,1602,17,1617],{"id":736,"className":1595},[16],[19,1597,318],{"id":1598},"pet-routing",[24,1600,1601],{},"\n    If no pet is configured, OpenCode events target the desktop default pet.\n    If a pet ID is configured, the plugin and MCP command target that pet.\n  ",[28,1603,32,1605,32,1612,17],{"className":1604},[268],[28,1606,1608,1610],{"className":1607},[272],[274,1609,756],{},[274,1611,759],{},[281,1613,1614],{},[74,1615,1616],{},"OpenCode\n  -> OpenPets plugin or OpenPets MCP tools\n  -> @open-pets/client\n  -> OpenPets desktop local IPC\n  -> default pet or selected agent pet",[152,1618,32,1619,32,1622,32,1625,32,1628,17],{},[155,1620,1621],{},"No configured pet: use the desktop default pet.",[155,1623,1624],{},"Configured installed pet: use an explicit agent pet lease.",[155,1626,1627],{},"Missing, invalid, or broken pet: fall back to the default pet.",[155,1629,1630],{},"Lease close or expiry: agent pet window closes when the last lease ends.",[12,1632,17,1634,17,1636,17,1639],{"id":783,"className":1633},[16],[19,1635,788],{"id":787},[24,1637,1638],{},"\n    OpenCode integration is fire-and-forget. It should not slow down OpenCode\n    or change OpenCode behavior if OpenPets is closed.\n  ",[28,1640,32,1642,17],{"className":1641},[31],[34,1643,36,1644,36,1652,32],{},[38,1645,1646],{},[42,1647,1648,1650],{},[45,1649,803],{},[45,1651,806],{},[55,1653,40,1654,40,1662,40,1670,40,1678,40,1686,40,1694,36],{},[42,1655,1656,1659],{},[61,1657,1658],{},"Feedback loops",[61,1660,1661],{},"OpenPets MCP tools are ignored by the plugin event mapper.",[42,1663,1664,1667],{},[61,1665,1666],{},"Speech cooldown",[61,1668,1669],{},"Normal and error speech are throttled.",[42,1671,1672,1675],{},[61,1673,1674],{},"Permission speech",[61,1676,1677],{},"Permission messages use their own shorter cooldown.",[42,1679,1680,1683],{},[61,1681,1682],{},"Repeated reactions",[61,1684,1685],{},"Same reaction is suppressed briefly to avoid spam.",[42,1687,1688,1691],{},[61,1689,1690],{},"Debug logs",[61,1692,1693],{},"Paths and secret-like values are sanitized.",[42,1695,1696,1699],{},[61,1697,1698],{},"Config edits",[61,1700,1701],{},"Atomic writes, backups, permission checks, symlink rejection, and size limits.",[12,1703,17,1705,17,1707,17,1711,17,1727,17,1731,17,1741,17,1745,17,1748],{"id":859,"className":1704},[16],[19,1706,863],{"id":859},[307,1708,1710],{"id":1709},"opencode-does-not-react","OpenCode does not react",[152,1712,32,1713,32,1715,32,1718,32,1721,17],{},[155,1714,921],{},[155,1716,1717],{},"Restart OpenCode after changing plugin or MCP configuration.",[155,1719,1720],{},"Check that your global or project OpenCode config includes the OpenPets plugin and MCP server.",[155,1722,1723,1724,1726],{},"Use the desktop detail page ",[64,1725,878],{}," action to re-check global setup.",[307,1728,1730],{"id":1729},"status-says-custom-or-conflict","Status says custom or conflict",[24,1732,1733,1734,891,1737,1740],{},"\n    Review the OpenCode config before forcing an update. Keep your own notes\n    outside ",[74,1735,1736],{},"OPENPETS:START",[74,1738,1739],{},"OPENPETS:END"," so OpenPets\n    can safely refresh its managed block.\n  ",[307,1742,1744],{"id":1743},"the-wrong-pet-appears","The wrong pet appears",[24,1746,1747],{},"\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  ",[28,1749,32,1751,32,1759,17],{"className":1750},[268],[28,1752,1754,1757],{"className":1753},[272],[274,1755,1756],{},"Refresh project setup",[274,1758,300],{},[281,1760,1761],{},[74,1762,1763],{},"npx -y @open-pets/cli@latest configure --agent opencode --pet \u003Cpet-id> --cwd . --force",{"title":952,"searchDepth":953,"depth":953,"links":1765},[1766,1767,1768,1771,1772,1777,1778,1779,1780,1781],{"id":21,"depth":953,"text":22},{"id":116,"depth":953,"text":120},{"id":1123,"depth":953,"text":1124,"children":1769},[1770],{"id":309,"depth":960,"text":310},{"id":1228,"depth":953,"text":1232},{"id":1310,"depth":953,"text":1311,"children":1773},[1774,1775,1776],{"id":1317,"depth":960,"text":1318},{"id":1349,"depth":960,"text":1350},{"id":462,"depth":960,"text":310},{"id":1394,"depth":953,"text":1395},{"id":1528,"depth":953,"text":1532},{"id":1598,"depth":953,"text":318},{"id":787,"depth":953,"text":788},{"id":859,"depth":953,"text":863,"children":1782},[1783,1784,1785],{"id":1709,"depth":960,"text":1710},{"id":1729,"depth":960,"text":1730},{"id":1743,"depth":960,"text":1744},"Connect OpenCode to OpenPets with the OpenPets plugin, MCP tools, global desktop setup, project-local setup, pet routing, and safe managed instructions.","Companion plugin","/opencode.png",{},"/integrations/opencode",{"title":990,"description":1786},"integrations/opencode","Connect OpenCode to OpenPets with the OpenPets plugin, MCP tools, global setup, and project-local configuration.","_rBN4eE3gjZQYcbabTZj_DgC5c0EGuC7I9NSy9CgRwo",{"id":1796,"title":1797,"active":7,"body":1798,"description":2659,"extension":378,"eyebrow":2660,"icon":979,"image":2661,"meta":2662,"name":1895,"navTitle":1895,"navigation":7,"order":2663,"path":2664,"seo":2665,"slug":2666,"status":984,"stem":2667,"summary":2668,"toc":979,"__hash__":2669},"integrations_en/integrations/cursor.md","Cursor + OpenPets",{"type":9,"value":1799,"toc":2633},[1800,1884,1928,2114,2269,2327,2368,2434,2541,2618],[12,1801,17,1803,17,1805,17,1808,17,1875],{"id":14,"className":1802},[16],[19,1804,22],{"id":21},[24,1806,1807],{},"\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  ",[28,1809,32,1811,17],{"className":1810},[31],[34,1812,36,1813,36,1824,32],{},[38,1814,40,1815,36],{},[42,1816,1817,1819,1821],{},[45,1818,47],{},[45,1820,50],{},[45,1822,1823],{},"What it gives Cursor",[55,1825,40,1826,40,1846,40,1862,36],{},[42,1827,59,1828,59,1832,59,1834,40],{},[61,1829,1830],{},[64,1831,66],{},[61,1833,69],{},[61,1835,72,1836,77,1838,81,1840,1842,1843,85],{},[74,1837,76],{},[74,1839,80],{},[74,1841,84],{}," via ",[74,1844,1845],{},"@open-pets/mcp",[42,1847,59,1848,59,1853,59,1855,40],{},[61,1849,1850],{},[64,1851,1852],{},"Project rules",[61,1854,107],{},[61,1856,1857,1858,1861],{},"A short ",[74,1859,1860],{},".mdc"," rule that tells Cursor when to use the OpenPets tools and what never to put in pet messages.",[42,1863,59,1864,59,1869,59,1872,40],{},[61,1865,1866],{},[64,1867,1868],{},"Hooks / lifecycle reactions",[61,1870,1871],{},"Not yet",[61,1873,1874],{},"Ambient Cursor hooks are a future phase and intentionally not written until a validation spike is complete.",[24,1876,1877,1878,1880,1881,1883],{},"\n    Runtime is local. Cursor launches ",[74,1879,1845],{}," as a stdio MCP\n    server, the server uses ",[74,1882,1068],{},", 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  ",[12,1885,17,1887,17,1889,17,1904,17,1925],{"id":116,"className":1886},[16],[19,1888,120],{"id":116},[24,1890,123,1891,127,1893,1896,1897,1900,1901,1903],{},[64,1892,126],{},[64,1894,1895],{},"Cursor"," card. ",[64,1898,1899],{},"Install global setup"," writes\n    the global Cursor MCP entry for your user account, and ",[64,1902,168],{},"\n    opens the detail panel for pet routing, JSON preview, and remove actions.\n  ",[152,1905,32,1906,32,1917,32,1922,17],{},[155,1907,1908,1910,1911,1913,1914,85],{},[64,1909,1899],{}," adds the ",[74,1912,162],{}," MCP server to ",[74,1915,1916],{},"~/.cursor/mcp.json",[155,1918,1919,1921],{},[64,1920,168],{}," opens advanced status, pet routing, project rules preview, and remove controls.",[155,1923,1924],{},"Restart Cursor, reload the window, or start a fresh chat if OpenPets tools do not appear immediately.",[24,1926,1927],{},"\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  ",[12,1929,17,1931,17,1933,17,1939,17,1987,17,1991,17,2000,17,2040,17,2044,17,2060,17,2073,17,2077,17,2093,17,2109],{"id":185,"className":1930},[16],[19,1932,189],{"id":185},[24,1934,1935,1936,1938],{},"\n    MCP is the main Cursor-to-OpenPets bridge. OpenPets writes a single MCP\n    entry named ",[74,1937,162],{},"; unrelated MCP servers and top-level\n    fields in your Cursor config are preserved.\n  ",[28,1940,32,1942,17],{"className":1941},[31],[34,1943,36,1944,36,1955,32],{},[38,1945,40,1946,36],{},[42,1947,1948,1950,1952],{},[45,1949,217],{},[45,1951,220],{},[45,1953,1954],{},"When Cursor should use it",[55,1956,40,1957,40,1967,40,1977,36],{},[42,1958,59,1959,59,1963,59,1965,40],{},[61,1960,1961],{},[74,1962,76],{},[61,1964,234],{},[61,1966,237],{},[42,1968,59,1969,59,1973,59,1975,40],{},[61,1970,1971],{},[74,1972,80],{},[61,1974,246],{},[61,1976,249],{},[42,1978,59,1979,59,1983,59,1985,40],{},[61,1980,1981],{},[74,1982,84],{},[61,1984,258],{},[61,1986,261],{},[307,1988,1990],{"id":1989},"global-vs-project-mcp-config","Global vs project MCP config",[24,1992,1993,1994,1996,1997,1999],{},"\n    Cursor merges global and project MCP config. When both define an\n    ",[74,1995,162],{}," server, the project entry wins for that workspace.\n    OpenPets always uses the server name ",[74,1998,162],{}," so you can\n    override a global default per repository.\n  ",[28,2001,32,2003,17],{"className":2002},[31],[34,2004,36,2005,36,2016,32],{},[38,2006,40,2007,36],{},[42,2008,2009,2011,2013],{},[45,2010,1263],{},[45,2012,1266],{},[45,2014,2015],{},"File",[55,2017,40,2018,40,2029,36],{},[42,2019,59,2020,59,2022,59,2025,40],{},[61,2021,1124],{},[61,2023,2024],{},"Personal machine-wide Cursor setup.",[61,2026,2027],{},[74,2028,1916],{},[42,2030,59,2031,59,2033,59,2035,40],{},[61,2032,1289],{},[61,2034,1292],{},[61,2036,2037],{},[74,2038,2039],{},"\u003Cproject>/.cursor/mcp.json",[307,2041,2043],{"id":2042},"expected-mcp-entry","Expected MCP entry",[28,2045,32,2047,32,2055,17],{"className":2046},[268],[28,2048,2050,2053],{"className":2049},[272],[274,2051,2052],{},"~/.cursor/mcp.json or \u003Cproject>/.cursor/mcp.json",[274,2054,279],{},[281,2056,2057],{},[74,2058,2059],{},"{\n  \"mcpServers\": {\n    \"openpets\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@open-pets/mcp@latest\", \"--pet\", \"\u003Cpet-id>\"]\n    }\n  }\n}",[24,2061,2062,2063,2065,2066,2068,2069,2072],{},"\n    If no pet is selected, ",[74,2064,322],{}," is omitted and OpenPets\n    routes to the desktop default pet. OpenPets pins a specific\n    ",[74,2067,1845],{}," version when it writes the entry; the\n    ",[74,2070,2071],{},"@latest"," shown above is the readable equivalent for manual setup.\n  ",[307,2074,2076],{"id":2075},"project-setup-with-the-cli","Project setup with the CLI",[28,2078,32,2080,32,2088,17],{"className":2079},[268],[28,2081,2083,2086],{"className":2082},[272],[274,2084,2085],{},"Project MCP only",[274,2087,300],{},[281,2089,2090],{},[74,2091,2092],{},"npx -y @open-pets/cli@latest configure --agent cursor --pet \u003Cpet-id>",[28,2094,32,2096,32,2104,17],{"className":2095},[268],[28,2097,2099,2102],{"className":2098},[272],[274,2100,2101],{},"Project MCP from another directory",[274,2103,300],{},[281,2105,2106],{},[74,2107,2108],{},"npx -y @open-pets/cli@latest configure --agent cursor --cwd /path/to/project --pet \u003Cpet-id>",[24,2110,32,2111,2113],{},[74,2112,1381],{}," is optional. If omitted, the CLI may prompt from installed\n    pets via the running desktop app.\n  ",[12,2115,17,2118,17,2122,17,2125,17,2141,17,2157,17,2173,17,2182,17,2198,17,2202,2259],{"id":2116,"className":2117},"project-rules",[16],[19,2119,2121],{"id":2120},"optional-project-rules","Optional project rules",[24,2123,2124],{},"\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  ",[28,2126,32,2128,32,2136,17],{"className":2127},[268],[28,2129,2131,2134],{"className":2130},[272],[274,2132,2133],{},"Install or update the project rule only",[274,2135,300],{},[281,2137,2138],{},[74,2139,2140],{},"npx -y @open-pets/cli@latest configure --agent cursor --rules-only",[28,2142,32,2144,32,2152,17],{"className":2143},[268],[28,2145,2147,2150],{"className":2146},[272],[274,2148,2149],{},"Install MCP and rules together",[274,2151,300],{},[281,2153,2154],{},[74,2155,2156],{},"npx -y @open-pets/cli@latest configure --agent cursor --pet \u003Cpet-id> --with-rules",[28,2158,32,2160,32,2168,17],{"className":2159},[268],[28,2161,2163,2166],{"className":2162},[272],[274,2164,2165],{},"Remove only the managed rule",[274,2167,300],{},[281,2169,2170],{},[74,2171,2172],{},"npx -y @open-pets/cli@latest configure --agent cursor --remove-rules",[24,2174,32,2175,891,2178,2181],{},[74,2176,2177],{},"--rules-only",[74,2179,2180],{},"--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  ",[28,2183,32,2185,32,2193,17],{"className":2184},[268],[28,2186,2188,2191],{"className":2187},[272],[274,2189,2190],{},"Rule path",[274,2192,759],{},[281,2194,2195],{},[74,2196,2197],{},"\u003Cproject>/.cursor/rules/openpets.mdc",[307,2199,2201],{"id":2200},"rule-content","Rule content",[28,2203,32,2205,32,2214],{"className":2204},[268],[28,2206,2208,2211],{"className":2207},[272],[274,2209,2210],{},".cursor/rules/openpets.mdc",[274,2212,2213],{},"mdc",[281,2215,2216,2230],{},[74,2217,2218,2219,2222,2227],{},"---\ndescription: Use OpenPets MCP tools for lightweight coding-status feedback.\n---\n",[24,2220,2221],{},"\u003C!-- OPENPETS:CURSOR_RULES:START -->",[2223,2224,2226],"h1",{"id":2225},"openpets-status-feedback","OpenPets status feedback",[24,2228,2229],{},"You may use the OpenPets MCP tools as a brief, safe status channel during meaningful coding work.",[152,2231,2232,2254],{},[74,2233,2234,2239,2245,2248,2251],{},[155,2235,325,2236,2238],{},[74,2237,84],{}," sparingly for major milestones, blocking states, completion, or when review is needed.",[155,2240,2241,2242,2244],{},"Prefer ",[74,2243,80],{}," over speech for lightweight progress such as thinking, working, testing, success, or error.",[155,2246,2247],{},"Keep messages short, user-facing, and safe.",[155,2249,2250],{},"Do not send prompts, tool input/output, code, logs, stack traces, credentials, private file contents, URLs, file paths, or other sensitive content through OpenPets.",[155,2252,2253],{},"Do not spam every internal step; use OpenPets only for meaningful progress changes and continue normally if a status update is unnecessary.",[155,2255,2256],{},[74,2257,2258],{},"If OpenPets is unavailable, continue the coding task without failing.\n\u003C!-- OPENPETS:CURSOR_RULES:END -->",[24,2260,2261,2262,2264,2265,2268],{},"\n  OpenPets intentionally does ",[64,2263,181],{}," set ",[74,2266,2267],{},"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",[12,2270,17,2273,17,2277,17,2289,17,2305],{"id":2271,"className":2272},"force-and-conflicts",[16],[19,2274,2276],{"id":2275},"force-conflicts-and-backups","Force, conflicts, and backups",[24,2278,2279,2280,2284,2285,2288],{},"\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 ",[2281,2282,2283],"em",{},"custom"," or ",[2281,2286,2287],{},"conflict"," and nothing is rewritten\n    without an explicit opt-in.\n  ",[28,2290,32,2292,32,2300,17],{"className":2291},[268],[28,2293,2295,2298],{"className":2294},[272],[274,2296,2297],{},"Force replace, scoped",[274,2299,300],{},[281,2301,2302],{},[74,2303,2304],{},"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",[152,2306,32,2307,32,2313,32,2318,32,2321,17],{},[155,2308,2309,2310,85],{},"MCP replacement touches only ",[74,2311,2312],{},"mcpServers.openpets",[155,2314,2315,2316,85],{},"Rules replacement touches only ",[74,2317,2210],{},[155,2319,2320],{},"Backups are created before any replace or remove operation.",[155,2322,2323,2326],{},[74,2324,2325],{},"--with-rules"," preflights MCP and rules together so a half-applied setup is avoided.",[12,2328,17,2330,17,2332,17,2338,17,2353],{"id":1598,"className":2329},[16],[19,2331,318],{"id":1598},[24,2333,2334,2335,2337],{},"\n    Without a selected pet, Cursor targets the OpenPets desktop default pet.\n    With a selected pet, OpenPets adds ",[74,2336,322],{}," to the MCP\n    command so Cursor targets that companion.\n  ",[28,2339,32,2341,32,2348,17],{"className":2340},[268],[28,2342,2344,2346],{"className":2343},[272],[274,2345,756],{},[274,2347,759],{},[281,2349,2350],{},[74,2351,2352],{},"Cursor\n  -> OpenPets MCP server (@open-pets/mcp)\n  -> @open-pets/client\n  -> OpenPets desktop local IPC\n  -> default pet or selected agent pet",[152,2354,32,2355,32,2358,32,2363,32,2365,17],{},[155,2356,2357],{},"No selected pet: MCP targets the desktop default pet.",[155,2359,2360,2361,85],{},"Selected pet: the MCP args include ",[74,2362,322],{},[155,2364,777],{},[155,2366,2367],{},"If a requested pet is missing or unavailable, OpenPets falls back safely instead of breaking Cursor.",[12,2369,17,2372,17,2376,17,2380,17,2383,17,2402,17,2405,17,2409,17,2412,17,2431],{"id":2370,"className":2371},"caveats",[16],[19,2373,2375],{"id":2374},"cursor-behavior-and-caveats","Cursor behavior and caveats",[307,2377,2379],{"id":2378},"restart-reload-or-new-chat","Restart, reload, or new chat",[24,2381,2382],{},"\n    Cursor MCP loading varies by version and environment. If OpenPets tools do\n    not appear after install:\n  ",[2384,2385,32,2386,32,2389,32,2392,32,2395,17],"ol",{},[155,2387,2388],{},"Start a new Cursor chat.",[155,2390,2391],{},"Reload the Cursor window.",[155,2393,2394],{},"Fully restart Cursor.",[155,2396,2397,2398,2401],{},"Verify Node and npm can run the configured ",[74,2399,2400],{},"npx"," command.",[24,2403,2404],{},"\n    Rules are included as chat context, so changed rules may also need a new or\n    refreshed chat to be picked up.\n  ",[307,2406,2408],{"id":2407},"wsl-remote-and-devcontainer","WSL, remote, and devcontainer",[24,2410,2411],{},"\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  ",[152,2413,32,2414,32,2417,32,2422,17],{},[155,2415,2416],{},"Cursor may show MCP connection failures.",[155,2418,2419,2421],{},[74,2420,76],{}," may report the desktop as unreachable.",[155,2423,2424,2425,2284,2427,2430],{},"The configured ",[74,2426,2400],{},[74,2428,2429],{},"node"," command may exist in one environment but not the one Cursor uses.",[24,2432,2433],{},"\n    Workarounds depend on the environment. OpenPets does not currently write\n    WSL or devcontainer-specific MCP entries automatically.\n  ",[12,2435,17,2437,17,2439,17,2442],{"id":783,"className":2436},[16],[19,2438,788],{"id":787},[24,2440,2441],{},"\n    OpenPets treats Cursor config as user-owned. MCP and rules edits are\n    scoped, audited, and reversible.\n  ",[28,2443,32,2445,17],{"className":2444},[31],[34,2446,36,2447,36,2455,32],{},[38,2448,2449],{},[42,2450,2451,2453],{},[45,2452,803],{},[45,2454,806],{},[55,2456,40,2457,40,2468,40,2482,40,2490,40,2498,40,2505,40,2513,40,2521,40,2529,36],{},[42,2458,2459,2462],{},[61,2460,2461],{},"Scoped MCP edits",[61,2463,2464,2465,2467],{},"Only ",[74,2466,2312],{}," is read, written, replaced, or removed; unrelated servers and fields are preserved.",[42,2469,2470,2473],{},[61,2471,2472],{},"Scoped rules edits",[61,2474,2464,2475,2477,2478,2481],{},[74,2476,2210],{}," is touched. Other rule files and the ",[74,2479,2480],{},".cursor"," directory itself are left in place.",[42,2483,2484,2487],{},[61,2485,2486],{},"Strict JSON",[61,2488,2489],{},"MCP config is read as strict JSON. Files that do not parse are classified as invalid instead of being rewritten.",[42,2491,2492,2495],{},[61,2493,2494],{},"Size limits",[61,2496,2497],{},"MCP config reads cap at 256 KiB. Rule reads cap at 64 KiB.",[42,2499,2500,2502],{},[61,2501,853],{},[61,2503,2504],{},"Atomic temp-file writes with rename, plus backups before any replace or remove.",[42,2506,2507,2510],{},[61,2508,2509],{},"Symlink rejection",[61,2511,2512],{},"Symlinked config files, non-regular files, unsafe parents, and dangling symlinks are refused.",[42,2514,2515,2518],{},[61,2516,2517],{},"Managed detection",[61,2519,2520],{},"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.",[42,2522,2523,2526],{},[61,2524,2525],{},"Preview redaction",[61,2527,2528],{},"The desktop preview shows only the OpenPets MCP entry; broader previews redact sensitive-looking fields.",[42,2530,2531,2534],{},[61,2532,2533],{},"No broad permissions",[61,2535,2536,2537,2540],{},"OpenPets never writes ",[74,2538,2539],{},"~/.cursor/permissions.json"," or adds broad MCP/tool allowlists.",[12,2542,17,2544,17,2546,17,2550,17,2570,17,2574,17,2587,17,2591,17,2593,17,2608,17,2612],{"id":859,"className":2543},[16],[19,2545,863],{"id":859},[307,2547,2549],{"id":2548},"cursor-does-not-show-openpets-tools","Cursor does not show OpenPets tools",[152,2551,32,2552,32,2555,32,2561,32,2567,17],{},[155,2553,2554],{},"Start a new chat, reload the window, or fully restart Cursor.",[155,2556,2557,2558,2560],{},"Confirm OpenPets desktop is running and click ",[64,2559,878],{}," on the Cursor detail panel.",[155,2562,729,2563,2566],{},[74,2564,2565],{},"npx -y @open-pets/mcp@latest --help"," in a terminal to confirm npm can resolve the package.",[155,2568,2569],{},"If Cursor runs in WSL, remote, or a devcontainer, see the caveats above.",[307,2571,2573],{"id":2572},"openpets-reports-the-mcp-entry-as-custom-or-conflicted","OpenPets reports the MCP entry as custom or conflicted",[24,2575,2576,2577,2579,2580,2583,2584,2586],{},"\n    A custom or conflicted status means the existing ",[74,2578,162],{},"\n    entry, the MCP config file, or the rule file does not match what OpenPets\n    manages. OpenPets leaves it alone. Use ",[64,2581,2582],{},"Replace"," in the\n    detail panel, or the ",[74,2585,1386],{}," CLI flag, only when you want\n    OpenPets to recreate its managed entry or file.\n  ",[307,2588,2590],{"id":2589},"wrong-pet-appears","Wrong pet appears",[24,2592,1747],{},[28,2594,32,2596,32,2603,17],{"className":2595},[268],[28,2597,2599,2601],{"className":2598},[272],[274,2600,1756],{},[274,2602,300],{},[281,2604,2605],{},[74,2606,2607],{},"npx -y @open-pets/cli@latest configure --agent cursor --pet \u003Cpet-id> --cwd . --force",[307,2609,2611],{"id":2610},"remove-or-reset","Remove or reset",[24,2613,2614,2615,2617],{},"\n    Remove the global MCP entry from the desktop detail panel. Remove the\n    project rule with ",[74,2616,2172],{},".\n    Both operations create backups before touching managed content.\n  ",[12,2619,17,2622,17,2626],{"id":2620,"className":2621},"whats-next",[16],[19,2623,2625],{"id":2624},"what-is-next","What is next",[24,2627,2628,2629,2632],{},"\n    Cursor MCP and project rules are complete. The next phase would be\n    ",[64,2630,2631],{},"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":952,"searchDepth":953,"depth":953,"links":2634},[2635,2636,2637,2642,2645,2646,2647,2651,2652,2658],{"id":21,"depth":953,"text":22},{"id":116,"depth":953,"text":120},{"id":185,"depth":953,"text":189,"children":2638},[2639,2640,2641],{"id":1989,"depth":960,"text":1990},{"id":2042,"depth":960,"text":2043},{"id":2075,"depth":960,"text":2076},{"id":2120,"depth":953,"text":2121,"children":2643},[2644],{"id":2200,"depth":960,"text":2201},{"id":2275,"depth":953,"text":2276},{"id":1598,"depth":953,"text":318},{"id":2374,"depth":953,"text":2375,"children":2648},[2649,2650],{"id":2378,"depth":960,"text":2379},{"id":2407,"depth":960,"text":2408},{"id":787,"depth":953,"text":788},{"id":859,"depth":953,"text":863,"children":2653},[2654,2655,2656,2657],{"id":2548,"depth":960,"text":2549},{"id":2572,"depth":960,"text":2573},{"id":2589,"depth":960,"text":2590},{"id":2610,"depth":960,"text":2611},{"id":2624,"depth":953,"text":2625},"Connect Cursor to OpenPets with global or project MCP setup, optional project rules, pet routing, managed safety, and conflict handling.","MCP + project rules","/integrations/cursor.svg",{},4,"/integrations/cursor",{"title":1797,"description":2659},"cursor","integrations/cursor","Connect Cursor to OpenPets with global or project MCP setup, optional project rules, and pet routing.","56H52XouYlzjSTN_AD2lQtbbVDJRJjEg7KEJZQaoDb0",{"id":2671,"title":2672,"active":7,"body":2673,"description":3273,"extension":378,"eyebrow":2708,"icon":979,"image":3274,"meta":3275,"name":3276,"navTitle":3276,"navigation":7,"order":2663,"path":3277,"seo":3278,"slug":3279,"status":984,"stem":3280,"summary":3281,"toc":979,"__hash__":3282},"integrations_en/integrations/pi.md","Pi + OpenPets",{"type":9,"value":2674,"toc":3260},[2675,2757,2804,2895,3099,3173,3196,3243],[12,2676,17,2678,17,2680,17,2685,17,2754],{"id":14,"className":2677},[16],[19,2679,22],{"id":21},[24,2681,2682,2683,1346],{},"\n    The Pi integration is an extension package, not an MCP setup. It loads\n    inside Pi, listens to Pi session and tool events directly, and forwards a\n    small set of safe reactions to your running OpenPets desktop app through\n    ",[74,2684,1068],{},[28,2686,32,2688,17],{"className":2687},[31],[34,2689,36,2690,36,2700,32],{},[38,2691,40,2692,36],{},[42,2693,2694,2696,2698],{},[45,2695,47],{},[45,2697,1014],{},[45,2699,1017],{},[55,2701,40,2702,40,2715,40,2728,36],{},[42,2703,59,2704,59,2709,59,2712,40],{},[61,2705,2706],{},[64,2707,2708],{},"Pi extension",[61,2710,2711],{},"Subscribes to Pi session, agent, and tool events.",[61,2713,2714],{},"The pet can react automatically while Pi thinks, edits, runs commands, succeeds, or errors.",[42,2716,59,2717,59,2722,59,2725,40],{},[61,2718,2719],{},[64,2720,2721],{},"OpenPets IPC client",[61,2723,2724],{},"Sends reactions and short status messages over local IPC.",[61,2726,2727],{},"Runtime is local. Pi never depends on a remote service to control the pet.",[42,2729,59,2730,59,2735,59,2751,40],{},[61,2731,2732],{},[64,2733,2734],{},"/openpets commands",[61,2736,2737,2738,77,2741,77,2744,81,2747,2750],{},"Adds ",[74,2739,2740],{},"status",[74,2742,2743],{},"test",[74,2745,2746],{},"react",[74,2748,2749],{},"say"," subcommands.",[61,2752,2753],{},"Users can verify the connection and trigger manual reactions from inside Pi.",[24,2755,2756],{},"\n    Runtime control is best-effort. Pi keeps working if the OpenPets desktop app\n    is closed; the extension quietly skips pet updates until the desktop app is\n    reachable again.\n  ",[12,2758,17,2761,17,2763,17,2766,17,2782,17,2797],{"id":2759,"className":2760},"install",[16],[19,2762,134],{"id":2759},[24,2764,2765],{},"\n    Keep the OpenPets desktop app running, then install the Pi extension package\n    with Pi. Use global setup for your machine, or project-local setup for a\n    single repository.\n  ",[28,2767,32,2769,32,2777,17],{"className":2768},[268],[28,2770,2772,2775],{"className":2771},[272],[274,2773,2774],{},"Global setup",[274,2776,300],{},[281,2778,2779],{},[74,2780,2781],{},"pi install npm:@open-pets/pi",[28,2783,32,2785,32,2792,17],{"className":2784},[268],[28,2786,2788,2790],{"className":2787},[272],[274,2789,1232],{},[274,2791,300],{},[281,2793,2794],{},[74,2795,2796],{},"pi install -l npm:@open-pets/pi",[24,2798,2799,2800,2803],{},"\n    Global setup writes to Pi's global package settings. Project-local setup\n    writes to ",[74,2801,2802],{},".pi/settings.json",", which is better when a repository\n    should explicitly carry its OpenPets behavior. Reload or restart Pi after\n    changing package settings so the new extension is loaded.\n  ",[12,2805,17,2808,17,2812,17,2815,17,2889],{"id":2806,"className":2807},"commands",[16],[19,2809,2811],{"id":2810},"slash-commands","Slash commands",[24,2813,2814],{},"\n    The extension registers one user-facing command namespace so you can test\n    and steer the integration without adding extra Pi tools. None of these\n    commands forward prompts or tool output.\n  ",[28,2816,32,2818,17],{"className":2817},[31],[34,2819,36,2820,36,2829,32],{},[38,2821,2822],{},[42,2823,2824,2827],{},[45,2825,2826],{},"Command",[45,2828,220],{},[55,2830,40,2831,40,2841,40,2851,40,2869,40,2879,36],{},[42,2832,2833,2838],{},[61,2834,2835],{},[74,2836,2837],{},"/openpets status",[61,2839,2840],{},"Check whether the OpenPets desktop app is reachable and which pet is targeted.",[42,2842,2843,2848],{},[61,2844,2845],{},[74,2846,2847],{},"/openpets test",[61,2849,2850],{},"Send a short test reaction and waving message.",[42,2852,2853,2858],{},[61,2854,2855],{},[74,2856,2857],{},"/openpets react \u003Creaction>",[61,2859,2860,2861,77,2863,77,2865,554,2867,85],{},"Manually set a safe reaction such as ",[74,2862,535],{},[74,2864,581],{},[74,2866,630],{},[74,2868,647],{},[42,2870,2871,2876],{},[61,2872,2873],{},[74,2874,2875],{},"/openpets say \u003Cmessage>",[61,2877,2878],{},"Show one short validated speech bubble.",[42,2880,2881,2886],{},[61,2882,2883],{},[74,2884,2885],{},"/openpets help",[61,2887,2888],{},"Print the available subcommands inside Pi.",[24,2890,2891,2892,2894],{},"\n    Manual ",[74,2893,2749],{}," input goes through the same OpenPets validator the\n    desktop app uses: brief, single-line, user-facing, and never code, logs,\n    paths, URLs, prompts, or secrets.\n  ",[12,2896,17,2899,17,2903,17,2906,17,3092],{"id":2897,"className":2898},"event-reactions",[16],[19,2900,2902],{"id":2901},"automatic-event-reactions","Automatic event reactions",[24,2904,2905],{},"\n    The extension maps Pi lifecycle events to pet reactions without asking the\n    model to call a tool. Most events are silent reaction-only updates; only\n    errors may speak, and only with a fixed safe message.\n  ",[28,2907,32,2909,17],{"className":2908},[31],[34,2910,36,2911,36,2924,32],{},[38,2912,40,2913,36],{},[42,2914,2915,2918,2920,2922],{},[45,2916,2917],{},"Pi event",[45,2919,1413],{},[45,2921,1416],{},[45,2923,518],{},[55,2925,40,2926,40,2944,40,2961,40,2978,40,2994,40,3009,40,3025,40,3040,40,3060,40,3076,36],{},[42,2927,2928,2933,2936,2941],{},[61,2929,2930],{},[74,2931,2932],{},"session_start",[61,2934,2935],{},"Pi starts, resumes, or reloads.",[61,2937,2938],{},[74,2939,2940],{},"waving",[61,2942,2943],{},"None by default.",[42,2945,2946,2951,2954,2958],{},[61,2947,2948],{},[74,2949,2950],{},"agent_start",[61,2952,2953],{},"Agent loop begins.",[61,2955,2956],{},[74,2957,535],{},[61,2959,2960],{},"None.",[42,2962,2963,2968,2971,2976],{},[61,2964,2965],{},[74,2966,2967],{},"turn_start",[61,2969,2970],{},"New turn begins.",[61,2972,2973],{},[74,2974,2975],{},"working",[61,2977,2960],{},[42,2979,2980,2985,2988,2992],{},[61,2981,2982],{},[74,2983,2984],{},"tool_execution_start",[61,2986,2987],{},"Tool looks like edit/write/patch/apply.",[61,2989,2990],{},[74,2991,562],{},[61,2993,2960],{},[42,2995,2996,3000,3003,3007],{},[61,2997,2998],{},[74,2999,2984],{},[61,3001,3002],{},"Tool or shell command looks test-like.",[61,3004,3005],{},[74,3006,581],{},[61,3008,2960],{},[42,3010,3011,3015,3018,3023],{},[61,3012,3013],{},[74,3014,2984],{},[61,3016,3017],{},"Shell/bash command, non-test.",[61,3019,3020],{},[74,3021,3022],{},"running",[61,3024,2960],{},[42,3026,3027,3031,3034,3038],{},[61,3028,3029],{},[74,3030,2984],{},[61,3032,3033],{},"Other tool.",[61,3035,3036],{},[74,3037,2975],{},[61,3039,2960],{},[42,3041,3042,3047,3053,3057],{},[61,3043,3044],{},[74,3045,3046],{},"tool_execution_end",[61,3048,3049,3052],{},[74,3050,3051],{},"isError"," is true.",[61,3054,3055],{},[74,3056,647],{},[61,3058,3059],{},"Short fixed error-pool message, throttled.",[42,3061,3062,3067,3070,3074],{},[61,3063,3064],{},[74,3065,3066],{},"agent_end",[61,3068,3069],{},"Agent loop finishes without a recent tool error.",[61,3071,3072],{},[74,3073,630],{},[61,3075,2960],{},[42,3077,3078,3083,3086,3090],{},[61,3079,3080],{},[74,3081,3082],{},"session_shutdown",[61,3084,3085],{},"Pi quits, reloads, switches, or forks.",[61,3087,3088],{},[74,3089,1516],{},[61,3091,2960],{},[24,3093,3094,3095,3098],{},"\n    The extension may inspect bounded tool-name and command slices only to\n    classify reactions. It does not speak raw commands, output, prompts, or file\n    paths. ",[74,3096,3097],{},"OpenPets","-related commands are filtered out so the pet\n    cannot self-trigger.\n  ",[12,3100,17,3102,17,3104,17,3107],{"id":783,"className":3101},[16],[19,3103,788],{"id":787},[24,3105,3106],{},"\n    The Pi extension follows the same safety model as Claude Code, OpenCode,\n    and the MCP server. It is designed for ambient visible status only.\n  ",[28,3108,32,3110,17],{"className":3109},[31],[34,3111,36,3112,36,3120,32],{},[38,3113,3114],{},[42,3115,3116,3118],{},[45,3117,803],{},[45,3119,806],{},[55,3121,40,3122,40,3130,40,3141,40,3149,40,3157,40,3165,36],{},[42,3123,3124,3127],{},[61,3125,3126],{},"No transcript forwarding",[61,3128,3129],{},"Automatic events never send prompts, assistant text, tool input, tool output, file contents, URLs, paths, or secrets.",[42,3131,3132,3135],{},[61,3133,3134],{},"Validated manual speech",[61,3136,3137,3140],{},[74,3138,3139],{},"/openpets say"," rejects multi-line, long, code-like, URL/path-like, or secret-looking text.",[42,3142,3143,3146],{},[61,3144,3145],{},"Best-effort runtime",[61,3147,3148],{},"OpenPets failures never block Pi model calls or tool execution.",[42,3150,3151,3154],{},[61,3152,3153],{},"No Pi tools in MVP",[61,3155,3156],{},"The extension registers a user slash command only. It does not expose model-callable Pi tools.",[42,3158,3159,3162],{},[61,3160,3161],{},"Trusted package boundary",[61,3163,3164],{},"Pi extensions run with local system permissions, so install only packages you trust.",[42,3166,3167,3170],{},[61,3168,3169],{},"Self-trigger guard",[61,3171,3172],{},"Tool calls related to OpenPets are ignored by the event mapper.",[12,3174,17,3176,17,3178,17,3181],{"id":736,"className":3175},[16],[19,3177,318],{"id":1598},[24,3179,3180],{},"\n    By default, automatic reactions and manual commands target the desktop\n    default pet. Explicit per-extension pet routing is deferred until a later\n    Pi subphase so the runtime contract stays simple.\n  ",[28,3182,32,3184,32,3191,17],{"className":3183},[268],[28,3185,3187,3189],{"className":3186},[272],[274,3188,756],{},[274,3190,759],{},[281,3192,3193],{},[74,3194,3195],{},"Pi\n  -> @open-pets/pi extension\n  -> @open-pets/client\n  -> OpenPets desktop local IPC\n  -> default pet",[12,3197,17,3199,17,3201,17,3205,17,3220,17,3224,17,3240],{"id":859,"className":3198},[16],[19,3200,863],{"id":859},[307,3202,3204],{"id":3203},"the-pet-does-not-react","The pet does not react",[152,3206,32,3207,32,3209,32,3214,32,3217,17],{},[155,3208,921],{},[155,3210,729,3211,3213],{},[74,3212,2837],{}," inside Pi.",[155,3215,3216],{},"Reload or restart Pi after installing or removing the package.",[155,3218,3219],{},"Remember that most automatic events are reaction-only and intentionally silent.",[307,3221,3223],{"id":3222},"remove-the-package","Remove the package",[28,3225,32,3227,32,3235,17],{"className":3226},[268],[28,3228,3230,3233],{"className":3229},[272],[274,3231,3232],{},"Remove global install",[274,3234,300],{},[281,3236,3237],{},[74,3238,3239],{},"pi remove npm:@open-pets/pi",[24,3241,3242],{},"\n    For project-local installs, run the remove command from the project where\n    you installed the package and follow Pi's project settings behavior.\n  ",[12,3244,17,3246,17,3249],{"id":2740,"className":3245},[16],[19,3247,3248],{"id":2740},"Status",[24,3250,3251,3252,3255,3256,3259],{},"\n    The ",[74,3253,3254],{},"@open-pets/pi"," package is published on npm and follows the\n    same safety model as the other OpenPets integrations. The Pi package API\n    surface this version is built against is\n    ",[74,3257,3258],{},"@earendil-works/pi-coding-agent","; pin or upgrade Pi as part of\n    your normal Pi update flow.\n  ",{"title":952,"searchDepth":953,"depth":953,"links":3261},[3262,3263,3264,3265,3266,3267,3268,3272],{"id":21,"depth":953,"text":22},{"id":2759,"depth":953,"text":134},{"id":2810,"depth":953,"text":2811},{"id":2901,"depth":953,"text":2902},{"id":787,"depth":953,"text":788},{"id":1598,"depth":953,"text":318},{"id":859,"depth":953,"text":863,"children":3269},[3270,3271],{"id":3203,"depth":960,"text":3204},{"id":3222,"depth":960,"text":3223},{"id":2740,"depth":953,"text":3248},"Connect Pi to OpenPets with the @open-pets/pi extension package, automatic safe reactions, manual slash commands, and no prompt or tool-output forwarding.","/integrations/pi.svg",{},"Pi","/integrations/pi",{"title":2672,"description":3273},"pi","integrations/pi","Use the @open-pets/pi extension package to turn Pi coding-agent activity into local desktop pet reactions without forwarding prompts or tool output.","sjg8cCk8693fEBhVQkp080QPOjST2Jhy-Qu4qT90i5c",{"id":3284,"title":3285,"active":7,"body":3286,"description":3754,"extension":378,"eyebrow":3755,"icon":3756,"image":979,"meta":3757,"name":3758,"navTitle":3758,"navigation":7,"order":3759,"path":3760,"seo":3761,"slug":3762,"status":984,"stem":3763,"summary":3764,"toc":979,"__hash__":3765},"integrations_en/integrations/cli.md","CLI & shell scripts + OpenPets",{"type":9,"value":3287,"toc":3739},[3288,3381,3404,3504,3550,3609,3636,3691],[12,3289,17,3291,17,3293,17,3296,17,3364],{"id":14,"className":3290},[16],[19,3292,22],{"id":21},[24,3294,3295],{},"\n    The OpenPets CLI lets terminal commands talk to your running OpenPets\n    desktop app. Use it when you want a pet reaction from a shell script, an npm\n    script, a local build command, a git hook, or a custom automation tool.\n  ",[28,3297,32,3299,17],{"className":3298},[31],[34,3300,36,3301,36,3312,32],{},[38,3302,40,3303,36],{},[42,3304,3305,3307,3309],{},[45,3306,2826],{},[45,3308,1014],{},[45,3310,3311],{},"Good for",[55,3313,40,3314,40,3327,40,3340,40,3352,36],{},[42,3315,3316,3321,3324],{},[61,3317,3318],{},[74,3319,3320],{},"npx -y @open-pets/cli@latest status",[61,3322,3323],{},"Checks whether the desktop app is reachable.",[61,3325,3326],{},"Setup checks and troubleshooting.",[42,3328,3329,3334,3337],{},[61,3330,3331],{},[74,3332,3333],{},"npx -y @open-pets/cli@latest pets",[61,3335,3336],{},"Lists installed pets and marks the default pet.",[61,3338,3339],{},"Finding pet ids before routing setup.",[42,3341,3342,3347,3349],{},[61,3343,3344],{},[74,3345,3346],{},"npx -y @open-pets/cli@latest react \u003Creaction>",[61,3348,246],{},[61,3350,3351],{},"Silent success, error, testing, waiting, or working states.",[42,3353,3354,3359,3361],{},[61,3355,3356],{},[74,3357,3358],{},"npx -y @open-pets/cli@latest say \u003Cmessage>",[61,3360,258],{},[61,3362,3363],{},"Meaningful local automation updates.",[24,3365,3366,3367,3370,3371,3373,3374,3377,3378,3380],{},"\n    The CLI is distributed as the npm package ",[74,3368,3369],{},"@open-pets/cli",". The\n    desktop app does not install a shell command; use ",[74,3372,2400],{}," for one-off\n    commands, ",[74,3375,3376],{},"npm exec"," for explicit package execution, or an optional\n    global npm install if you want a permanent ",[74,3379,162],{}," command.\n  ",[12,3382,17,3385,17,3388],{"id":3383,"className":3384},"requirements",[16],[19,3386,3387],{"id":3383},"Requirements",[152,3389,32,3390,32,3393,32,3401,17],{},[155,3391,3392],{},"The OpenPets desktop app must be running.",[155,3394,3395,3396,77,3398,3400],{},"Node.js and npm must be available for ",[74,3397,2400],{},[74,3399,3376],{},", or optional global npm installs.",[155,3402,3403],{},"The CLI talks to the desktop app over OpenPets local IPC; it does not send commands through a cloud service.",[12,3405,17,3408,17,3412,17,3417,17,3432,17,3447,17,3463,17,3479,17,3488],{"id":3406,"className":3407},"quick-start",[16],[19,3409,3411],{"id":3410},"quick-start-with-npx","Quick start with npx",[24,3413,939,3414,3416],{},[74,3415,2400],{}," when you want the command without installing anything\n    globally. The examples below always fetch the latest published OpenPets CLI.\n  ",[28,3418,32,3420,32,3428,17],{"className":3419},[268],[28,3421,3423,3426],{"className":3422},[272],[274,3424,3425],{},"Check desktop status",[274,3427,300],{},[281,3429,3430],{},[74,3431,3320],{},[28,3433,32,3435,32,3443,17],{"className":3434},[268],[28,3436,3438,3441],{"className":3437},[272],[274,3439,3440],{},"List installed pets",[274,3442,300],{},[281,3444,3445],{},[74,3446,3333],{},[28,3448,32,3450,32,3458,17],{"className":3449},[268],[28,3451,3453,3456],{"className":3452},[272],[274,3454,3455],{},"Send a reaction",[274,3457,300],{},[281,3459,3460],{},[74,3461,3462],{},"npx -y @open-pets/cli@latest react success",[28,3464,32,3466,32,3474,17],{"className":3465},[268],[28,3467,3469,3472],{"className":3468},[272],[274,3470,3471],{},"Show a short message",[274,3473,300],{},[281,3475,3476],{},[74,3477,3478],{},"npx -y @open-pets/cli@latest say \"Build finished\" --reaction celebrating",[24,3480,3481,3482,3484,3485,3487],{},"\n    If your npm environment has stale ",[74,3483,2400],{}," cache metadata, the equivalent\n    ",[74,3486,3376],{}," form is:\n  ",[28,3489,32,3491,32,3499,17],{"className":3490},[268],[28,3492,3494,3497],{"className":3493},[272],[274,3495,3496],{},"npm exec form",[274,3498,300],{},[281,3500,3501],{},[74,3502,3503],{},"npm exec --yes --package=@open-pets/cli@latest -- openpets --help",[12,3505,17,3508,17,3512,17,3518,17,3534],{"id":3506,"className":3507},"global-install",[16],[19,3509,3511],{"id":3510},"optional-global-install","Optional global install",[24,3513,3514,3515,3517],{},"\n    If you want to type ",[74,3516,162],{}," directly in your terminal, install the\n    CLI globally. This is separate from downloading the desktop app.\n  ",[28,3519,32,3521,32,3529,17],{"className":3520},[268],[28,3522,3524,3527],{"className":3523},[272],[274,3525,3526],{},"Install once",[274,3528,300],{},[281,3530,3531],{},[74,3532,3533],{},"npm install -g @open-pets/cli",[28,3535,32,3537,32,3545,17],{"className":3536},[268],[28,3538,3540,3543],{"className":3539},[272],[274,3541,3542],{},"Use directly",[274,3544,300],{},[281,3546,3547],{},[74,3548,3549],{},"openpets status\nopenpets react testing\nopenpets say \"Tests are running\" --reaction testing",[12,3551,17,3554,17,3558,17,3561,17,3577,17,3593],{"id":3552,"className":3553},"script-examples",[16],[19,3555,3557],{"id":3556},"shell-script-examples","Shell script examples",[24,3559,3560],{},"\n    Keep messages short and human-facing. Use reactions for noisy steps and\n    speech only for meaningful moments.\n  ",[28,3562,32,3564,32,3572,17],{"className":3563},[268],[28,3565,3567,3570],{"className":3566},[272],[274,3568,3569],{},"npm test notification",[274,3571,300],{},[281,3573,3574],{},[74,3575,3576],{},"npm test \\\n  && npx -y @open-pets/cli@latest say \"Tests passed\" --reaction success \\\n  || npx -y @open-pets/cli@latest say \"Tests failed\" --reaction error",[28,3578,32,3580,32,3588,17],{"className":3579},[268],[28,3581,3583,3586],{"className":3582},[272],[274,3584,3585],{},"Build script",[274,3587,300],{},[281,3589,3590],{},[74,3591,3592],{},"npx -y @open-pets/cli@latest react running\npnpm build\nnpx -y @open-pets/cli@latest react success",[28,3594,32,3596,32,3604,17],{"className":3595},[268],[28,3597,3599,3602],{"className":3598},[272],[274,3600,3601],{},"package.json script",[274,3603,279],{},[281,3605,3606],{},[74,3607,3608],{},"{\n  \"scripts\": {\n    \"test:pet\": \"npm test && npx -y @open-pets/cli@latest say 'Tests passed' --reaction success\"\n  }\n}",[12,3610,17,3613,17,3617,17,3620],{"id":3611,"className":3612},"reactions",[16],[19,3614,3616],{"id":3615},"available-reactions","Available reactions",[24,3618,3619],{},"\n    The CLI accepts the same reaction names as the OpenPets local client and MCP\n    tools:\n  ",[28,3621,32,3623,32,3631,17],{"className":3622},[268],[28,3624,3626,3629],{"className":3625},[272],[274,3627,3628],{},"Reaction names",[274,3630,759],{},[281,3632,3633],{},[74,3634,3635],{},"idle\nthinking\nworking\nediting\nrunning\ntesting\nwaiting\nwaving\nsuccess\nerror\ncelebrating",[12,3637,17,3639,17,3643,17,3646],{"id":783,"className":3638},[16],[19,3640,3642],{"id":3641},"message-safety","Message safety",[24,3644,3645],{},"\n    Pet speech is visible on your desktop. Treat it like a tiny public status\n    channel, not a log sink.\n  ",[28,3647,32,3649,17],{"className":3648},[31],[34,3650,36,3651,36,3660,32],{},[38,3652,3653],{},[42,3654,3655,3658],{},[45,3656,3657],{},"Good",[45,3659,417],{},[55,3661,40,3662,40,3672,40,3681,36],{},[42,3663,3664,3669],{},[61,3665,3666],{},[74,3667,3668],{},"Build finished.",[61,3670,3671],{},"Full command output or stack traces.",[42,3673,3674,3678],{},[61,3675,3676],{},[74,3677,436],{},[61,3679,3680],{},"File paths, URLs, or private repo details.",[42,3682,3683,3688],{},[61,3684,3685],{},[74,3686,3687],{},"Waiting for review.",[61,3689,3690],{},"Secrets, tokens, prompts, or user messages.",[12,3692,17,3694,17,3696,17,3702,17,3715,17,3719,17,3732,17,3736],{"id":859,"className":3693},[16],[19,3695,863],{"id":859},[307,3697,3699,3701],{"id":3698},"npx-y-open-petsclilatest-status-says-the-app-is-unavailable",[74,3700,3320],{}," says the app is unavailable",[152,3703,32,3704,32,3707,32,3710,17],{},[155,3705,3706],{},"Open the OpenPets desktop app first.",[155,3708,3709],{},"Restart the desktop app if it was updated while running.",[155,3711,729,3712,3714],{},[74,3713,3320],{}," again.",[307,3716,3718],{"id":3717},"the-desktop-app-did-not-install-a-shell-command","The desktop app did not install a shell command",[24,3720,3721,3722,3725,3726,3728,3729,3731],{},"\n    Downloading the desktop app does not install a shell command. Use\n    ",[74,3723,3724],{},"npx -y @open-pets/cli@latest ...",", use ",[74,3727,3376],{},", or install\n    ",[74,3730,3369],{}," globally with npm if you want a permanent command.\n  ",[307,3733,3735],{"id":3734},"a-reaction-name-is-rejected","A reaction name is rejected",[24,3737,3738],{},"\n    Use one of the reaction names listed above. The CLI validates reaction names\n    before sending them to the desktop app.\n  ",{"title":952,"searchDepth":953,"depth":953,"links":3740},[3741,3742,3743,3744,3745,3746,3747,3748],{"id":21,"depth":953,"text":22},{"id":3383,"depth":953,"text":3387},{"id":3410,"depth":953,"text":3411},{"id":3510,"depth":953,"text":3511},{"id":3556,"depth":953,"text":3557},{"id":3615,"depth":953,"text":3616},{"id":3641,"depth":953,"text":3642},{"id":859,"depth":953,"text":863,"children":3749},[3750,3752,3753],{"id":3698,"depth":960,"text":3751},"npx -y @open-pets/cli@latest status says the app is unavailable",{"id":3717,"depth":960,"text":3718},{"id":3734,"depth":960,"text":3735},"Use the published OpenPets npm CLI to check desktop status, list pets, send reactions, show short messages, and wire OpenPets into local shell automation.","npm CLI","fa6-solid:terminal",{},"CLI & shell scripts",5,"/integrations/cli",{"title":3285,"description":3754},"cli","integrations/cli","Send pet reactions and short messages from terminal commands, npm scripts, git hooks, and local automation with @open-pets/cli.","k6FPc-JfG3KTDGrgjQ8Ez3DqBIm5XSuC_iK34DXm31I",{"id":3767,"title":3768,"active":7,"body":3769,"description":4149,"extension":378,"eyebrow":4150,"icon":4151,"image":979,"meta":4152,"name":4153,"navTitle":4153,"navigation":7,"order":4154,"path":4155,"seo":4156,"slug":3893,"status":984,"stem":4157,"summary":4158,"toc":979,"__hash__":4159},"integrations_en/integrations/mcp.md","Generic MCP clients + OpenPets",{"type":9,"value":3770,"toc":4135},[3771,3840,3858,3909,3947,3995,4031,4085],[12,3772,17,3774,17,3776,17,3779,17,3831],{"id":14,"className":3773},[16],[19,3775,22],{"id":21},[24,3777,3778],{},"\n    The Generic MCP integration is for any assistant or editor that can launch a\n    stdio MCP server. Instead of using a dedicated OpenPets setup flow, you add\n    the OpenPets MCP command to your client's MCP configuration.\n  ",[28,3780,32,3782,17],{"className":3781},[31],[34,3783,36,3784,36,3795,32],{},[38,3785,40,3786,36],{},[42,3787,3788,3790,3792],{},[45,3789,217],{},[45,3791,220],{},[45,3793,3794],{},"Safety model",[55,3796,40,3797,40,3809,40,3820,36],{},[42,3798,3799,3803,3806],{},[61,3800,3801],{},[74,3802,76],{},[61,3804,3805],{},"Checks whether OpenPets is reachable and which pet is targeted.",[61,3807,3808],{},"Read-only setup and health check.",[42,3810,3811,3815,3817],{},[61,3812,3813],{},[74,3814,80],{},[61,3816,246],{},[61,3818,3819],{},"Use for silent states like thinking, testing, waiting, success, or error.",[42,3821,3822,3826,3828],{},[61,3823,3824],{},[74,3825,84],{},[61,3827,258],{},[61,3829,3830],{},"Rejects long, multiline, code-like, URL/path-like, or secret-looking messages.",[24,3832,3833,3834,3836,3837,3839],{},"\n    Runtime is local. Your MCP client launches ",[74,3835,1845],{},", the MCP\n    server uses ",[74,3838,1068],{},", and the client talks to the running\n    OpenPets desktop app over local IPC.\n  ",[12,3841,17,3843,17,3845],{"id":3383,"className":3842},[16],[19,3844,3387],{"id":3383},[152,3846,32,3847,32,3850,32,3853,17],{},[155,3848,3849],{},"The OpenPets desktop app must be running for pet updates to work.",[155,3851,3852],{},"Your assistant or editor must support stdio MCP servers.",[155,3854,3855,3856,2401],{},"Node.js and npm must be available if you use the published ",[74,3857,2400],{},[12,3859,17,3862,17,3866,17,3869,17,3885],{"id":3860,"className":3861},"config",[16],[19,3863,3865],{"id":3864},"generic-mcp-config","Generic MCP config",[24,3867,3868],{},"\n    MCP clients use different root keys, but the command and arguments are the\n    important part. Adapt the wrapper shape to your client's MCP format.\n  ",[28,3870,32,3872,32,3880,17],{"className":3871},[268],[28,3873,3875,3878],{"className":3874},[272],[274,3876,3877],{},"Generic stdio MCP server",[274,3879,279],{},[281,3881,3882],{},[74,3883,3884],{},"{\n  \"mcpServers\": {\n    \"openpets\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@open-pets/mcp@latest\"]\n    }\n  }\n}",[24,3886,3887,3888,77,3891,554,3894,3897,3898,3901,3902,3904,3905,3908],{},"\n    Some clients use a ",[74,3889,3890],{},"servers",[74,3892,3893],{},"mcp",[74,3895,3896],{},"context_servers","\n    root instead of ",[74,3899,3900],{},"mcpServers",". Keep the command as\n    ",[74,3903,2400],{}," and the args as ",[74,3906,3907],{},"[\"-y\", \"@open-pets/mcp@latest\"]"," unless\n    your client requires a different executable format.\n  ",[12,3910,17,3912,17,3914,17,3920,17,3936],{"id":1598,"className":3911},[16],[19,3913,318],{"id":1598},[24,3915,3916,3917,3919],{},"\n    By default, the MCP server targets the desktop app's default pet. Add\n    ",[74,3918,322],{}," when you want this MCP process to request a specific\n    installed pet.\n  ",[28,3921,32,3923,32,3931,17],{"className":3922},[268],[28,3924,3926,3929],{"className":3925},[272],[274,3927,3928],{},"Target a specific pet",[274,3930,279],{},[281,3932,3933],{},[74,3934,3935],{},"{\n  \"mcpServers\": {\n    \"openpets\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@open-pets/mcp@latest\", \"--pet\", \"fixer\"]\n    }\n  }\n}",[152,3937,32,3938,32,3941,32,3944,17],{},[155,3939,3940],{},"If the requested pet is available, OpenPets routes this MCP session to that pet.",[155,3942,3943],{},"If the requested pet is missing or unavailable, OpenPets falls back safely instead of breaking the assistant.",[155,3945,3946],{},"Explicit pet routing uses a short lease so agent pets can clean up automatically.",[12,3948,17,3951,17,3955,17,3958],{"id":3949,"className":3950},"instructions",[16],[19,3952,3954],{"id":3953},"recommended-assistant-instructions","Recommended assistant instructions",[24,3956,3957],{},"\n    MCP gives your assistant tools, but instructions teach it how to use those\n    tools without leaking private context into a visible desktop bubble. Add a\n    short rule block wherever your MCP client stores assistant instructions.\n  ",[28,3959,32,3961,32,3969],{"className":3960},[268],[28,3962,3964,3967],{"className":3963},[272],[274,3965,3966],{},"OpenPets assistant guidance",[274,3968,378],{},[281,3970,3971,3974],{},[74,3972,3973],{},"OpenPets MCP tools may be available.\n",[152,3975,3976,3990],{},[74,3977,3978,3981,3984,3987],{},[155,3979,3980],{},"Use openpets_status before using OpenPets or when debugging availability.",[155,3982,3983],{},"Use openpets_react for silent state changes like thinking, editing, testing, waiting, success, or error.",[155,3985,3986],{},"Use openpets_say only for short visible status messages.",[155,3988,3989],{},"Never send code, logs, command output, file paths, URLs, secrets, tokens, user prompts, or private data to openpets_say.",[155,3991,3992],{},[74,3993,3994],{},"Do not spam every internal step.",[12,3996,17,3998,17,4002,17,4005,17,4021],{"id":2743,"className":3997},[16],[19,3999,4001],{"id":4000},"test-the-connection","Test the connection",[24,4003,4004],{},"\n    After your MCP client loads the server, ask it to use OpenPets intentionally:\n  ",[28,4006,32,4008,32,4016,17],{"className":4007},[268],[28,4009,4011,4014],{"className":4010},[272],[274,4012,4013],{},"Test prompt",[274,4015,759],{},[281,4017,4018],{},[74,4019,4020],{},"Check OpenPets status. If it is available, send a short \"connected\" message and a waving reaction.",[24,4022,4023,4024,77,4026,4028,4029,1346],{},"\n    If your client exposes MCP tool calls in a debug panel, you should see\n    ",[74,4025,76],{},[74,4027,80],{},", and\n    ",[74,4030,84],{},[12,4032,17,4034,17,4036],{"id":783,"className":4033},[16],[19,4035,788],{"id":787},[28,4037,32,4039,17],{"className":4038},[31],[34,4040,36,4041,36,4049,32],{},[38,4042,4043],{},[42,4044,4045,4047],{},[45,4046,803],{},[45,4048,806],{},[55,4050,40,4051,40,4061,40,4069,40,4077,36],{},[42,4052,4053,4056],{},[61,4054,4055],{},"Short speech",[61,4057,4058,4060],{},[74,4059,84],{}," accepts messages up to 140 characters.",[42,4062,4063,4066],{},[61,4064,4065],{},"Single line",[61,4067,4068],{},"Multiline messages are rejected.",[42,4070,4071,4074],{},[61,4072,4073],{},"No code or logs",[61,4075,4076],{},"Code-like text, command output, URLs, file paths, and secret-looking text are rejected.",[42,4078,4079,4082],{},[61,4080,4081],{},"Best-effort availability",[61,4083,4084],{},"If the desktop app is closed, tools return an MCP error instead of crashing your assistant.",[12,4086,17,4088,17,4090,17,4094,17,4109,17,4113,17,4128,17,4132],{"id":859,"className":4087},[16],[19,4089,863],{"id":859},[307,4091,4093],{"id":4092},"the-mcp-tools-do-not-appear","The MCP tools do not appear",[152,4095,32,4096,32,4099,32,4102,32,4106,17],{},[155,4097,4098],{},"Restart or reload your MCP client after changing config.",[155,4100,4101],{},"Confirm the client supports stdio MCP servers.",[155,4103,729,4104,2566],{},[74,4105,2565],{},[155,4107,4108],{},"Check that your config uses the correct root key for your client.",[307,4110,4112],{"id":4111},"the-tools-appear-but-openpets-is-unavailable","The tools appear but OpenPets is unavailable",[152,4114,32,4115,32,4117,32,4122,17],{},[155,4116,3706],{},[155,4118,4119,4120,85],{},"Ask the assistant to call ",[74,4121,76],{},[155,4123,4124,4125,4127],{},"If using ",[74,4126,1381],{},", confirm the pet id is installed with the OpenPets desktop app or the OpenPets CLI.",[307,4129,4131],{"id":4130},"should-i-use-generic-mcp-or-a-dedicated-integration","Should I use Generic MCP or a dedicated integration?",[24,4133,4134],{},"\n    Use Claude Code or OpenCode pages when you use those tools; they include\n    dedicated setup flows and managed instructions. Use Generic MCP when your\n    tool supports MCP but OpenPets does not yet have a dedicated setup page for it.\n  ",{"title":952,"searchDepth":953,"depth":953,"links":4136},[4137,4138,4139,4140,4141,4142,4143,4144],{"id":21,"depth":953,"text":22},{"id":3383,"depth":953,"text":3387},{"id":3864,"depth":953,"text":3865},{"id":1598,"depth":953,"text":318},{"id":3953,"depth":953,"text":3954},{"id":4000,"depth":953,"text":4001},{"id":787,"depth":953,"text":788},{"id":859,"depth":953,"text":863,"children":4145},[4146,4147,4148],{"id":4092,"depth":960,"text":4093},{"id":4111,"depth":960,"text":4112},{"id":4130,"depth":960,"text":4131},"Connect any stdio MCP-capable assistant to OpenPets with the published OpenPets MCP server, safe tools, pet routing, and local desktop IPC.","stdio MCP","fa6-solid:plug",{},"Generic MCP",6,"/integrations/mcp",{"title":3768,"description":4149},"integrations/mcp","Connect any assistant with stdio MCP support to OpenPets using the published @open-pets/mcp server.","PmKC6fyeiEP1ld2goHCy1VMoBXmalOVS3qYRYQH9e9E",{"id":4161,"title":4162,"active":4163,"body":4164,"description":4179,"extension":378,"eyebrow":4180,"icon":4181,"image":979,"meta":4182,"name":4183,"navTitle":4183,"navigation":7,"order":4184,"path":4185,"seo":4186,"slug":4187,"status":4172,"stem":4188,"summary":4189,"toc":979,"__hash__":4190},"integrations_en/integrations/windsurf.md","Windsurf + OpenPets",false,{"type":9,"value":4165,"toc":4176},[4166],[12,4167,17,4169,17,4173],{"className":4168},[16],[19,4170,4172],{"id":4171},"coming-soon","Coming soon",[24,4174,4175],{},"\n    Windsurf integration docs are not public yet. OpenPets will document the\n    supported MCP setup here when it is ready.\n  ",{"title":952,"searchDepth":953,"depth":953,"links":4177},[4178],{"id":4171,"depth":953,"text":4172},"Windsurf integration details for OpenPets are coming soon.","MCP config","simple-icons:windsurf",{},"Windsurf",8,"/integrations/windsurf",{"title":4162,"description":4179},"windsurf","integrations/windsurf","Windsurf support is planned. This guide will cover MCP configuration and safe agent instructions when it is ready.","heJkryyb6Xw5dsa-V6BxRd3oiPtgy8hXWhSwA4oDh_I",{"id":4192,"title":4193,"active":4163,"body":4194,"description":4207,"extension":378,"eyebrow":4180,"icon":979,"image":4208,"meta":4209,"name":4210,"navTitle":4210,"navigation":7,"order":4211,"path":4212,"seo":4213,"slug":4214,"status":4172,"stem":4215,"summary":4216,"toc":979,"__hash__":4217},"integrations_en/integrations/zed.md","Zed + OpenPets",{"type":9,"value":4195,"toc":4204},[4196],[12,4197,17,4199,17,4201],{"className":4198},[16],[19,4200,4172],{"id":4171},[24,4202,4203],{},"\n    Zed integration docs are not public yet. OpenPets will document the\n    supported context-server setup here when it is ready.\n  ",{"title":952,"searchDepth":953,"depth":953,"links":4205},[4206],{"id":4171,"depth":953,"text":4172},"Zed integration details for OpenPets are coming soon.","/integrations/zed.svg",{},"Zed",9,"/integrations/zed",{"title":4193,"description":4207},"zed","integrations/zed","Zed support is planned. This guide will cover context server setup and project rules when it is ready.","TQ7AA5QXKt1oxZHsvgR7K-9Je_Dfrk4T9uEov9QYjLs",{"id":4219,"title":4220,"active":4163,"body":4221,"description":4234,"extension":378,"eyebrow":4180,"icon":979,"image":4235,"meta":4236,"name":4237,"navTitle":4237,"navigation":7,"order":4238,"path":4239,"seo":4240,"slug":4241,"status":4172,"stem":4242,"summary":4243,"toc":979,"__hash__":4244},"integrations_en/integrations/vscode.md","VS Code + OpenPets",{"type":9,"value":4222,"toc":4231},[4223],[12,4224,17,4226,17,4228],{"className":4225},[16],[19,4227,4172],{"id":4171},[24,4229,4230],{},"\n    VS Code integration docs are not public yet. OpenPets will document the\n    supported MCP setup here when it is ready.\n  ",{"title":952,"searchDepth":953,"depth":953,"links":4232},[4233],{"id":4171,"depth":953,"text":4172},"VS Code integration details for OpenPets are coming soon.","/integrations/vscode.svg",{},"VS Code",10,"/integrations/vscode",{"title":4220,"description":4234},"vscode","integrations/vscode","VS Code support is planned. This guide will cover Copilot MCP setup when it is ready.","JWgmDnPnf76kMd1hFUc0tKSZXKtZNKqeig4qu5y2IYw",1781360000039]