[{"data":1,"prerenderedAt":987},["ShallowReactive",2],{"integrations-en:/integrations/claude":3},{"id":4,"title":5,"active":6,"body":7,"description":976,"extension":377,"eyebrow":977,"icon":978,"image":979,"meta":980,"name":129,"navTitle":129,"navigation":6,"order":952,"path":981,"seo":982,"slug":331,"status":983,"stem":984,"summary":985,"toc":978,"__hash__":986},"integrations_en/integrations/claude.md","Claude Code + OpenPets",true,{"type":8,"value":9,"toc":950},"minimark",[10,113,182,345,476,733,780,856],[11,12,16,17,16,22,16,26,16,110],"section",{"id":13,"className":14},"overview",[15],"docs-section","\n  ",[18,19,21],"h2",{"id":20},"what-this-integration-does","What this integration does",[23,24,25],"p",{},"\n    The 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  ",[27,28,31,32,16],"div",{"className":29},[30],"docs-table-wrap","\n    ",[33,34,35,36,35,53,31],"table",{},"\n      ",[37,38,39,40,35],"thead",{},"\n        ",[41,42,43,47,50],"tr",{},[44,45,46],"th",{},"Part",[44,48,49],{},"Required?",[44,51,52],{},"What it gives Claude",[54,55,39,56,39,85,39,97,35],"tbody",{},[41,57,58,59,58,66,58,69,39],{},"\n          ",[60,61,62],"td",{},[63,64,65],"strong",{},"MCP server",[60,67,68],{},"Yes",[60,70,71,72,76,77,80,81,84],{},"Tools named ",[73,74,75],"code",{},"openpets_status",", ",[73,78,79],{},"openpets_react",", and ",[73,82,83],{},"openpets_say",".",[41,86,58,87,58,92,58,94,39],{},[60,88,89],{},[63,90,91],{},"Instructions / prompt guidance",[60,93,68],{},[60,95,96],{},"Rules that tell Claude when to use OpenPets and what never to put in visible pet messages.",[41,98,58,99,58,104,58,107,39],{},[60,100,101],{},[63,102,103],{},"Hooks",[60,105,106],{},"Optional",[60,108,109],{},"Automatic reactions from Claude lifecycle events, even when Claude does not call an MCP tool.",[23,111,112],{},"\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  ",[11,114,16,117,16,120,16,135,16,150,16,175],{"id":115,"className":116},"quick-install",[15],[18,118,119],{"id":115},"Quick install",[23,121,122,123,126,127,130,131,134],{},"\n    In the OpenPets desktop app, open ",[63,124,125],{},"Integrations"," and use the\n    ",[63,128,129],{},"Claude Code"," card. This card is for the normal user flow:\n    click ",[63,132,133],{},"Install",", restart Claude Code if it was already open,\n    and Claude can start using the OpenPets MCP tools.\n  ",[136,137,31,140,31,146,16],"figure",{"className":138},[139],"docs-screenshot",[141,142],"img",{"src":143,"alt":144,"loading":145},"/docs/claude-integrations-grid.png","OpenPets Integrations window showing the Claude Code card installed and other editor integration cards.","lazy",[147,148,149],"figcaption",{},"The integrations grid is the simple setup view. Install handles the Claude MCP connection and managed instructions; Configure opens advanced details.",[151,152,31,153,31,163,31,169,16],"ul",{},[154,155,156,158,159,162],"li",{},[63,157,133],{}," adds the Claude MCP server named ",[73,160,161],{},"openpets"," and updates OpenPets Claude instructions.",[154,164,165,168],{},[63,166,167],{},"Configure"," opens advanced MCP, instruction, hook, pet routing, and command detection controls.",[154,170,171,174],{},[63,172,173],{},"Installed"," means Claude already has an OpenPets MCP connection.",[23,176,177,178,181],{},"\n    Quick install does ",[63,179,180],{},"not"," install hooks. Hooks are intentionally\n    separate because they modify Claude Code hook settings and add automatic\n    reactions to Claude events.\n  ",[11,183,16,186,16,189,16,195,16,205,16,261,16,264,16,285,16,288,16,305,16,310],{"id":184,"className":185},"mcp-connection",[15],[18,187,188],{"id":184},"MCP connection",[23,190,191,192,194],{},"\n    MCP is the main Claude-to-OpenPets bridge. OpenPets registers a Claude MCP\n    server named ",[73,193,161],{},". After Claude loads it, Claude can call a\n    small safe tool set whenever it wants to show status on your desktop pet.\n  ",[136,196,31,198,31,202,16],{"className":197},[139],[141,199],{"src":200,"alt":201,"loading":145},"/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.",[147,203,204],{},"The MCP connection card shows Claude detection, pet routing, replace/remove controls, and the advanced MCP command and JSON preview.",[27,206,31,208,16],{"className":207},[30],[33,209,35,210,35,223,31],{},[37,211,39,212,35],{},[41,213,214,217,220],{},[44,215,216],{},"Tool",[44,218,219],{},"Purpose",[44,221,222],{},"When Claude should use it",[54,224,39,225,39,237,39,249,35],{},[41,226,58,227,58,231,58,234,39],{},[60,228,229],{},[73,230,75],{},[60,232,233],{},"Checks whether the OpenPets desktop app is reachable and which pet is targeted.",[60,235,236],{},"Before using OpenPets, or when debugging setup.",[41,238,58,239,58,243,58,246,39],{},[60,240,241],{},[73,242,79],{},[60,244,245],{},"Changes the pet reaction without showing text.",[60,247,248],{},"For silent state changes like thinking, editing, testing, waiting, success, or error.",[41,250,58,251,58,255,58,258,39],{},[60,252,253],{},[73,254,83],{},[60,256,257],{},"Shows one short visible speech bubble.",[60,259,260],{},"For meaningful progress, blockers, completion, or review handoff.",[23,262,263],{},"\n    In a packaged desktop build, the advanced MCP JSON preview uses the bundled\n    OpenPets MCP server inside the app:\n  ",[27,265,31,268,31,279,16],{"className":266},[267],"docs-code",[27,269,272,276],{"className":270},[271],"docs-code-bar",[273,274,275],"span",{},"Claude MCP JSON preview",[273,277,278],{},"json",[280,281,282],"pre",{},[73,283,284],{},"{\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}",[23,286,287],{},"\n    In published-package mode, the command is shorter and uses npm:\n  ",[27,289,31,291,31,300,16],{"className":290},[267],[27,292,294,297],{"className":293},[271],[273,295,296],{},"Published command",[273,298,299],{},"bash",[280,301,302],{},[73,303,304],{},"claude mcp add --scope user openpets -- npx -y @open-pets/mcp@latest --pet \u003Cpet-id>",[306,307,309],"h3",{"id":308},"customization-ideas","Customization ideas",[151,311,31,312,31,322,31,333,31,342,16],{},[154,313,314,315,318,319,84],{},"Select a specific pet in ",[63,316,317],{},"Pet routing"," to append ",[73,320,321],{},"--pet \u003Cpet-id>",[154,323,324,325,328,329,332],{},"Use ",[63,326,327],{},"Advanced detection"," if the ",[73,330,331],{},"claude"," command is not on PATH.",[154,334,324,335,338,339,341],{},[63,336,337],{},"Replace configuration"," only when you want OpenPets to recreate a custom ",[73,340,161],{}," MCP entry.",[154,343,344],{},"Use the JSON preview if you want to audit exactly what Claude will run.",[11,346,16,349,16,353,16,356,16,367,16,383,16,398,16,402,16,459,16,462],{"id":347,"className":348},"instructions-prompt",[15],[18,350,352],{"id":351},"claude-instructions-prompt-guidance","Claude instructions / prompt guidance",[23,354,355],{},"\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  ",[23,357,358,359,362,363,366],{},"\n    OpenPets writes its guidance to ",[73,360,361],{},"~/.claude/openpets.md"," and adds\n    one managed import to ",[73,364,365],{},"~/.claude/CLAUDE.md",". Existing Claude\n    instructions are preserved.\n  ",[27,368,31,370,31,378,16],{"className":369},[267],[27,371,373,375],{"className":372},[271],[273,374,365],{},[273,376,377],{},"md",[280,379,380],{},[73,381,382],{},"\u003C!-- OPENPETS:IMPORT:START -->\n@~/.claude/openpets.md\n\u003C!-- OPENPETS:IMPORT:END -->",[27,384,31,386,31,393],{"className":385},[267],[27,387,389,391],{"className":388},[271],[273,390,361],{},[273,392,377],{},[280,394,395],{},[73,396,397],{},"\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 -->",[306,399,401],{"id":400},"message-style","Message style",[27,403,31,405,16],{"className":404},[30],[33,406,35,407,35,417,31],{},[37,408,39,409,35],{},[41,410,411,414],{},[44,412,413],{},"Good pet message",[44,415,416],{},"Avoid",[54,418,39,419,39,429,39,439,39,449,35],{},[41,420,421,426],{},[60,422,423],{},[73,424,425],{},"Checking the next step.",[60,427,428],{},"Private file paths or repo structure.",[41,430,431,436],{},[60,432,433],{},[73,434,435],{},"Tests are running.",[60,437,438],{},"Raw command output or logs.",[41,440,441,446],{},[60,442,443],{},[73,444,445],{},"Waiting for approval.",[60,447,448],{},"User prompts, secrets, tokens, or URLs.",[41,450,451,456],{},[60,452,453],{},[73,454,455],{},"Ready with the result.",[60,457,458],{},"Code snippets or exact stack traces.",[306,460,309],{"id":461},"customization-ideas-1",[151,463,31,464,31,470,31,473,16],{},[154,465,466,467,84],{},"Add your own team style rules outside the OpenPets managed block in ",[73,468,469],{},"CLAUDE.md",[154,471,472],{},"Keep the OpenPets block focused on privacy and short status messages.",[154,474,475],{},"If you remove OpenPets later, the managed import and managed block can be removed cleanly.",[11,477,16,480,16,484,16,487,16,497,16,650,16,657,16,661,16,664,16,693,16,696,16,712,16,715],{"id":478,"className":479},"hooks",[15],[18,481,483],{"id":482},"optional-claude-hooks","Optional Claude hooks",[23,485,486],{},"\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  ",[136,488,31,490,31,494,16],{"className":489},[139],[141,491],{"src":492,"alt":493,"loading":145},"/docs/claude-instructions-hooks.png","Claude Code detail page showing the included Claude instructions card and optional Claude hooks card.",[147,495,496],{},"The hooks card is separate from basic install. It installs, checks, removes, and previews the Claude hook JSON.",[27,498,31,500,16],{"className":499},[30],[33,501,35,502,35,518,31],{},[37,503,39,504,35],{},[41,505,506,509,512,515],{},[44,507,508],{},"Claude event",[44,510,511],{},"When it fires",[44,513,514],{},"Pet reaction",[44,516,517],{},"Speech",[54,519,39,520,39,538,39,564,39,583,39,601,39,615,39,632,35],{},[41,521,522,527,530,535],{},[60,523,524],{},[73,525,526],{},"UserPromptSubmit",[60,528,529],{},"User submits a prompt.",[60,531,532],{},[73,533,534],{},"thinking",[60,536,537],{},"None",[41,539,540,545,557,562],{},[60,541,542],{},[73,543,544],{},"PreToolUse",[60,546,547,76,550,553,554,84],{},[73,548,549],{},"Edit",[73,551,552],{},"Write",", or ",[73,555,556],{},"MultiEdit",[60,558,559],{},[73,560,561],{},"editing",[60,563,537],{},[41,565,566,570,576,581],{},[60,567,568],{},[73,569,544],{},[60,571,572,575],{},[73,573,574],{},"Bash"," command looks test-like.",[60,577,578],{},[73,579,580],{},"testing",[60,582,537],{},[41,584,585,590,593,598],{},[60,586,587],{},[73,588,589],{},"PermissionRequest",[60,591,592],{},"Claude asks for approval.",[60,594,595],{},[73,596,597],{},"waiting",[60,599,600],{},"Short approval message",[41,602,603,608,611,613],{},[60,604,605],{},[73,606,607],{},"Notification",[60,609,610],{},"Claude emits a notification.",[60,612,537],{},[60,614,537],{},[41,616,617,622,625,630],{},[60,618,619],{},[73,620,621],{},"Stop",[60,623,624],{},"Claude finishes a response.",[60,626,627],{},[73,628,629],{},"success",[60,631,537],{},[41,633,634,639,642,647],{},[60,635,636],{},[73,637,638],{},"StopFailure",[60,640,641],{},"Claude finalization fails.",[60,643,644],{},[73,645,646],{},"error",[60,648,649],{},"Short error message",[23,651,652,653,656],{},"\n    Hook commands are marked with ",[73,654,655],{},"--openpets-managed",". OpenPets uses\n    that marker to update or remove only its own hooks while leaving unrelated\n    Claude Code hooks alone.\n  ",[306,658,660],{"id":659},"lifecycle-status-bubbles","Lifecycle status bubbles",[23,662,663],{},"\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  ",[151,665,31,666,31,672,31,678,31,686,16],{},[154,667,668,671],{},[63,669,670],{},"Working status"," appears for prompt, edit, and test activity.",[154,673,674,677],{},[63,675,676],{},"Waiting status"," appears when Claude asks for approval.",[154,679,680,683,684,84],{},[63,681,682],{},"Done status"," appears when Claude sends ",[73,685,621],{},[154,687,688,683,691,84],{},[63,689,690],{},"Error status",[73,692,638],{},[23,694,695],{},"\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  ",[27,697,31,699,31,707,16],{"className":698},[267],[27,700,702,705],{"className":701},[271],[273,703,704],{},"Hooks JSON preview",[273,706,278],{},[280,708,709],{},[73,710,711],{},"{\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}",[306,713,309],{"id":714},"customization-ideas-2",[151,716,31,717,31,720,31,723,31,726,16],{},[154,718,719],{},"Use hooks when you want ambient reactions for every Claude session.",[154,721,722],{},"Skip hooks if you only want Claude to use OpenPets intentionally through MCP tools.",[154,724,725],{},"Choose a pet in routing before installing hooks if you want hook events to target a specific companion.",[154,727,728,729,732],{},"Run ",[63,730,731],{},"Check hooks"," after updating Claude Code or moving the OpenPets app.",[11,734,16,737,16,741,16,747,16,764],{"id":735,"className":736},"pet-targeting",[15],[18,738,740],{"id":739},"pet-routing-and-customization","Pet routing and customization",[23,742,743,744,746],{},"\n    Without a selected pet, Claude targets the OpenPets default pet. With a\n    selected pet, OpenPets adds ",[73,745,321],{}," to the MCP and hook\n    commands so Claude targets that companion.\n  ",[27,748,31,750,31,759,16],{"className":749},[267],[27,751,753,756],{"className":752},[271],[273,754,755],{},"Runtime path",[273,757,758],{},"text",[280,760,761],{},[73,762,763],{},"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",[151,765,31,766,31,769,31,774,31,777,16],{},[154,767,768],{},"No selected pet: MCP tools and hooks target the desktop default pet.",[154,770,771,772,84],{},"Selected pet: commands include ",[73,773,321],{},[154,775,776],{},"Explicit pet sessions use short leases so agent pets clean up automatically.",[154,778,779],{},"If a requested pet is missing or unavailable, OpenPets falls back safely instead of breaking Claude.",[11,781,16,784,16,788,16,791],{"id":782,"className":783},"safety",[15],[18,785,787],{"id":786},"safety-and-behavior","Safety and behavior",[23,789,790],{},"\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  ",[27,792,31,794,16],{"className":793},[30],[33,795,35,796,35,806,31],{},[37,797,798],{},[41,799,800,803],{},[44,801,802],{},"Protection",[44,804,805],{},"Behavior",[54,807,39,808,39,816,39,824,39,832,39,840,39,848,35],{},[41,809,810,813],{},[60,811,812],{},"Managed instructions",[60,814,815],{},"Tell Claude to avoid code, logs, URLs, file paths, secrets, and user prompts in pet speech.",[41,817,818,821],{},[60,819,820],{},"Speech validation",[60,822,823],{},"Rejects unsafe-looking text before it reaches the desktop pet.",[41,825,826,829],{},[60,827,828],{},"Hook stdout",[60,830,831],{},"Hook commands stay quiet so Claude does not ingest accidental context.",[41,833,834,837],{},[60,835,836],{},"Hook errors",[60,838,839],{},"Ignored by default so pet issues do not break Claude sessions.",[41,841,842,845],{},[60,843,844],{},"Cooldowns",[60,846,847],{},"Repeated hook speech and reactions are throttled to avoid spam.",[41,849,850,853],{},[60,851,852],{},"Safe writes",[60,854,855],{},"OpenPets refuses unsafe symlink or non-regular file targets before editing Claude files.",[11,857,16,860,16,863,16,867,16,899,16,903,16,912,16,916,16,932,16,936],{"id":858,"className":859},"troubleshooting",[15],[18,861,862],{"id":858},"Troubleshooting",[306,864,866],{"id":865},"claude-does-not-show-openpets-tools","Claude does not show OpenPets tools",[151,868,31,869,31,872,31,878,31,884,31,894,16],{},[154,870,871],{},"Restart Claude Code after installing or replacing MCP configuration.",[154,873,874,875,84],{},"Open the Claude detail page and click ",[63,876,877],{},"Refresh",[154,879,728,880,883],{},[73,881,882],{},"claude --version"," in a terminal to confirm Claude is available.",[154,885,886,887,890,891,84],{},"Inspect the entry with ",[73,888,889],{},"claude mcp list"," and ",[73,892,893],{},"claude mcp get openpets",[154,895,896,897,84],{},"If Claude is installed in a custom location, add its full path under ",[63,898,327],{},[306,900,902],{"id":901},"openpets-says-the-mcp-entry-is-custom","OpenPets says the MCP entry is custom",[23,904,905,906,908,909,911],{},"\n    A custom entry means Claude already has a server named ",[73,907,161],{},",\n    but its command does not exactly match the current OpenPets recommendation.\n    OpenPets leaves it alone. Choose ",[63,910,337],{}," only\n    if you want the desktop app to recreate it.\n  ",[306,913,915],{"id":914},"the-pet-does-not-react-to-hooks","The pet does not react to hooks",[151,917,31,918,31,921,31,924,31,929,16],{},[154,919,920],{},"Confirm the OpenPets desktop app is running.",[154,922,923],{},"Confirm hooks are installed from the optional Claude hooks card.",[154,925,926,927,84],{},"Check that hook commands contain ",[73,928,655],{},[154,930,931],{},"Remember that most hook events are reaction-only and intentionally silent.",[306,933,935],{"id":934},"remove-or-reset-everything","Remove or reset everything",[23,937,938,939,942,943,945,946,949],{},"\n    Use ",[63,940,941],{},"Remove integration"," to remove the Claude MCP server named\n    ",[73,944,161],{}," and OpenPets-managed Claude instructions. Use\n    ",[63,947,948],{},"Remove hooks"," separately if you installed optional hooks.\n  ",{"title":951,"searchDepth":952,"depth":952,"links":953},"",2,[954,955,956,960,964,968,969,970],{"id":20,"depth":952,"text":21},{"id":115,"depth":952,"text":119},{"id":184,"depth":952,"text":188,"children":957},[958],{"id":308,"depth":959,"text":309},3,{"id":351,"depth":952,"text":352,"children":961},[962,963],{"id":400,"depth":959,"text":401},{"id":461,"depth":959,"text":309},{"id":482,"depth":952,"text":483,"children":965},[966,967],{"id":659,"depth":959,"text":660},{"id":714,"depth":959,"text":309},{"id":739,"depth":952,"text":740},{"id":786,"depth":952,"text":787},{"id":858,"depth":952,"text":862,"children":971},[972,973,974,975],{"id":865,"depth":959,"text":866},{"id":901,"depth":959,"text":902},{"id":914,"depth":959,"text":915},{"id":934,"depth":959,"text":935},"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":5,"description":976},"Active","integrations/claude","Connect Claude Code to OpenPets with one-click MCP setup, managed instructions, pet routing, and optional lifecycle hooks.","SFvaAJmZRycnkKJTqnVw-NaMfTP2AQzgWIiKWfHJLHw",1779284850983]