[{"data":1,"prerenderedAt":13258},["ShallowReactive",2],{"published-article-paths":3,"search-navigation":348,"category-articles-ja-travel":421},[4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,312,314,316,318,320,322,324,326,328,330,332,334,336,338,340,342,344,346],{"path":5},"\u002Fde\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":7},"\u002Fde\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":9},"\u002Fde\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":11},"\u002Fde\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":13},"\u002Fde\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":15},"\u002Fde\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":17},"\u002Fde\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":19},"\u002Fde\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":21},"\u002Fde\u002Farticle\u002Fsetup-antigravity-2",{"path":23},"\u002Fde\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":25},"\u002Fde\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":27},"\u002Fde\u002Farticle\u002Fsync-obsidian-across-devices",{"path":29},"\u002Fde\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":31},"\u002Fde\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":33},"\u002Fde\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":35},"\u002Fde\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":37},"\u002Fen\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":39},"\u002Fen\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":41},"\u002Fen\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":43},"\u002Fen\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":45},"\u002Fen\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":47},"\u002Fen\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":49},"\u002Fen\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":51},"\u002Fen\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":53},"\u002Fen\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":55},"\u002Fen\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":57},"\u002Fen\u002Farticle\u002Fsetup-antigravity-2",{"path":59},"\u002Fen\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":61},"\u002Fen\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":63},"\u002Fen\u002Farticle\u002Fsync-obsidian-across-devices",{"path":65},"\u002Fen\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":67},"\u002Fen\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":69},"\u002Fen\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":71},"\u002Fen\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":73},"\u002Fes\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":75},"\u002Fes\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":77},"\u002Fes\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":79},"\u002Fes\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":81},"\u002Fes\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":83},"\u002Fes\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":85},"\u002Fes\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":87},"\u002Fes\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":89},"\u002Fes\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":91},"\u002Fes\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":93},"\u002Fes\u002Farticle\u002Fsetup-antigravity-2",{"path":95},"\u002Fes\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":97},"\u002Fes\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":99},"\u002Fes\u002Farticle\u002Fsync-obsidian-across-devices",{"path":101},"\u002Fes\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":103},"\u002Fes\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":105},"\u002Fes\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":107},"\u002Fes\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":109},"\u002Ffr\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":111},"\u002Ffr\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":113},"\u002Ffr\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":115},"\u002Ffr\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":117},"\u002Ffr\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":119},"\u002Ffr\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":121},"\u002Ffr\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":123},"\u002Ffr\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":125},"\u002Ffr\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":127},"\u002Ffr\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":129},"\u002Ffr\u002Farticle\u002Fsetup-antigravity-2",{"path":131},"\u002Ffr\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":133},"\u002Ffr\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":135},"\u002Ffr\u002Farticle\u002Fsync-obsidian-across-devices",{"path":137},"\u002Ffr\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":139},"\u002Ffr\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":141},"\u002Ffr\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":143},"\u002Ffr\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":145},"\u002Fid\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":147},"\u002Fid\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":149},"\u002Fid\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":151},"\u002Fid\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":153},"\u002Fid\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":155},"\u002Fid\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":157},"\u002Fid\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":159},"\u002Fid\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":161},"\u002Fid\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":163},"\u002Fid\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":165},"\u002Fid\u002Farticle\u002Fsetup-antigravity-2",{"path":167},"\u002Fid\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":169},"\u002Fid\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":171},"\u002Fid\u002Farticle\u002Fsync-obsidian-across-devices",{"path":173},"\u002Fid\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":175},"\u002Fid\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":177},"\u002Fid\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":179},"\u002Fid\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":181},"\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":183},"\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":185},"\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":187},"\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":189},"\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":191},"\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":193},"\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":195},"\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":197},"\u002Fja\u002Farticle\u002Fsetup-antigravity-2",{"path":199},"\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":201},"\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":203},"\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices",{"path":205},"\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":207},"\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":209},"\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":211},"\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":213},"\u002Fpt\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":215},"\u002Fpt\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":217},"\u002Fpt\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":219},"\u002Fpt\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":221},"\u002Fpt\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":223},"\u002Fpt\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":225},"\u002Fpt\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":227},"\u002Fpt\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":229},"\u002Fpt\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":231},"\u002Fpt\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":233},"\u002Fpt\u002Farticle\u002Fsetup-antigravity-2",{"path":235},"\u002Fpt\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":237},"\u002Fpt\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":239},"\u002Fpt\u002Farticle\u002Fsync-obsidian-across-devices",{"path":241},"\u002Fpt\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":243},"\u002Fpt\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":245},"\u002Fpt\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":247},"\u002Fpt\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":249},"\u002Ftw\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":251},"\u002Ftw\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":253},"\u002Ftw\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":255},"\u002Ftw\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":257},"\u002Ftw\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":259},"\u002Ftw\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":261},"\u002Ftw\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":263},"\u002Ftw\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":265},"\u002Ftw\u002Farticle\u002Fsetup-antigravity-2",{"path":267},"\u002Ftw\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":269},"\u002Ftw\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":271},"\u002Ftw\u002Farticle\u002Fsync-obsidian-across-devices",{"path":273},"\u002Ftw\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":275},"\u002Ftw\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":277},"\u002Ftw\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":279},"\u002Ftw\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":281},"\u002Fvi\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":283},"\u002Fvi\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":285},"\u002Fvi\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":287},"\u002Fvi\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":289},"\u002Fvi\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":291},"\u002Fvi\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"path":293},"\u002Fvi\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":295},"\u002Fvi\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":297},"\u002Fvi\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":299},"\u002Fvi\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"path":301},"\u002Fvi\u002Farticle\u002Fsetup-antigravity-2",{"path":303},"\u002Fvi\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":305},"\u002Fvi\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":307},"\u002Fvi\u002Farticle\u002Fsync-obsidian-across-devices",{"path":309},"\u002Fvi\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":311},"\u002Fvi\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":313},"\u002Fvi\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":315},"\u002Fvi\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",{"path":317},"\u002Fzh\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"path":319},"\u002Fzh\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"path":321},"\u002Fzh\u002Farticle\u002Fcentralised-the-skills-for-agents",{"path":323},"\u002Fzh\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"path":325},"\u002Fzh\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"path":327},"\u002Fzh\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"path":329},"\u002Fzh\u002Farticle\u002Fself-hosted-travel-planner-trek",{"path":331},"\u002Fzh\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"path":333},"\u002Fzh\u002Farticle\u002Fsetup-antigravity-2",{"path":335},"\u002Fzh\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"path":337},"\u002Fzh\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"path":339},"\u002Fzh\u002Farticle\u002Fsync-obsidian-across-devices",{"path":341},"\u002Fzh\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"path":343},"\u002Fzh\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"path":345},"\u002Fzh\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"path":347},"\u002Fzh\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[349,353,357,361,365,369,373,377,381,385,389,393,397,401,405,409,413,417],{"title":350,"path":351,"stem":352},"AI Agent Skills: What They Are & How to Create Them","\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them","en\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",{"title":354,"path":355,"stem":356},"Bringing Buzz to DeepSeek Harness: Taught to Speak Nostr","\u002Farticle\u002Fbringing-buzz-to-deepseek-harness","en\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",{"title":358,"path":359,"stem":360},"Solving AI Agent Skills Fragmentation with npx skills","\u002Farticle\u002Fcentralised-the-skills-for-agents","en\u002Farticle\u002Fcentralised-the-skills-for-agents",{"title":362,"path":363,"stem":364},"How to Expose Hermes Agent Privately with Cloudflare WARP","\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp","en\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",{"title":366,"path":367,"stem":368},"How AI Agent Skills Replace Nuxt App Scaffolding Scripts","\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts","en\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",{"title":370,"path":371,"stem":372},"Stop Exposing Your Vault: Secure NodeWarden with Cloudflare","\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare","en\u002Farticle\u002Fhow-to-secure-nodewarden-at-cloudflare",{"title":374,"path":375,"stem":376},"How to Deploy Hermes Agent on a Linux VPS","\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server","en\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",{"title":378,"path":379,"stem":380},"Self-Host Your Travel Itineraries with TREK and Docker","\u002Farticle\u002Fself-hosted-travel-planner-trek","en\u002Farticle\u002Fself-hosted-travel-planner-trek",{"title":382,"path":383,"stem":384},"Self-Host Block's Buzz: Shared AI Agent Workspace","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues","en\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",{"title":386,"path":387,"stem":388},"How to Self-Host a BitWarden Compatible Server Nodewarden","\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare","en\u002Farticle\u002Fself-hosting-nodewarden-at-cloudflare",{"title":390,"path":391,"stem":392},"Google Antigravity 2 Hands-On: Setup & First Impressions","\u002Farticle\u002Fsetup-antigravity-2","en\u002Farticle\u002Fsetup-antigravity-2",{"title":394,"path":395,"stem":396},"NetSuite AI Connector Guide: MCP Setup & Use Cases","\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude","en\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",{"title":398,"path":399,"stem":400},"Switch Between Multiple Cloudflare WARP Orgs on Mac","\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac","en\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",{"title":402,"path":403,"stem":404},"How to Sync Obsidian Vaults Across Devices Securely","\u002Farticle\u002Fsync-obsidian-across-devices","en\u002Farticle\u002Fsync-obsidian-across-devices",{"title":406,"path":407,"stem":408},"Testing Claude Fable 5: A Financial Analysis Review","\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis","en\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",{"title":410,"path":411,"stem":412},"Guide to Browser and Scheduler in Antigravity 2","\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2","en\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",{"title":414,"path":415,"stem":416},"Build a Persistent AI Memory System on Cloudflare","\u002Farticle\u002Fuse-cloudflare-as-ai-memory","en\u002Farticle\u002Fuse-cloudflare-as-ai-memory",{"title":418,"path":419,"stem":420},"Antigravity 2 in Action: AI Agents, Skills, and MCP","\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2","en\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[422,1715,2656,4092,6251,7979,8597,9415,9942,10330,10938,11390,11605,11825,12165,12834],{"id":423,"title":424,"author":425,"body":426,"category":1669,"date":1673,"description":1674,"extension":1675,"image":1676,"imageAlt":1677,"isPublished":1070,"meta":1678,"minRead":1706,"navigation":1070,"path":183,"seo":1707,"stem":1709,"tags":1710,"updatedAt":1713,"__hash__":1714},"article\u002Fja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness.md","DeepSeek HarnessにBuzzを連携：自律型Nostrメッセージゲートウェイ構築実践ガイド","",{"type":427,"value":428,"toc":1653},"minimark",[429,437,460,468,471,475,480,525,528,588,592,599,877,880,884,889,896,900,914,918,929,983,990,994,997,1028,1031,1036,1087,1095,1101,1110,1116,1145,1159,1163,1172,1203,1228,1276,1283,1288,1294,1301,1307,1312,1319,1333,1339,1348,1389,1392,1398,1405,1411,1415,1418,1570,1573,1610,1614,1619,1623,1649],[430,431,432],"p",{},[433,434],"img",{"alt":435,"src":436},"Block Buzzチャンネルに接続されたDeepSeek Harnessメッセージゲートウェイの概要","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-nostr-gateway-overview.webp",[430,438,439,440,447,451,454,455,459],{},"DeepSeek Harness（DSH）の公式プラグインである**",[441,442,446],"a",{"href":443,"rel":444},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway",[445],"nofollow","dsh-message-gateway",[448,449,450],"strong",{},"は、Discord、Telegram、WeChatなどの多様なメッセージングプラットフォームへDeepSeek Harnessアシスタントを拡張します。本プラグインリポジトリがフォークおよび拡張され、対応プラットフォーム一覧に",[441,452,453],{"href":383},"Block製Buzzを自己ホスト：人とAIエージェントが自律的に協働する次世代共有ワークスペースの構築","**が追加されました。フォークされたオープンソースリポジトリはGitHub（ ",[441,456,457],{"href":457,"rel":458},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway",[445]," ）にて公開されています。",[461,462],"article-card",{"description":463,"image":464,"image-alt":465,"label":466,"min-read":467,"title":453,"to":383},"Blockが開発したAI協働スペース「Buzz」のNostrリレーを、Cloudflare DNSを介してUbuntu VPS上に自己ホストする方法を解説します。暗号鍵による安全な認証のもと、人間と各種AIエージェントがチャンネルやプロジェクトの履歴を共有し、自律的に連携するセキュアな作業環境を構築しましょう。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FJA-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","深みのあるブルーとオレンジのアクセントが効いたプレミアムな16:9のテックカード。Ubuntu VPS上にBlockのBuzzリレーを自己ホストする方法を表現し、すっきりとしたガラスモーフ調のパネルの中央にタイポグラフィを配置。","事前準備ガイド","12",[430,469,470],{},"DSHアシスタントは正式なメンバーとしてBuzzリレーに参加し、ダイレクトメッセージ（DM）や自身が@メンションされたチャンネルメッセージを受信し、Web UIと全く同一のチャット単位のエージェント実行パイプラインを通じて応答します。",[472,473,474],"h2",{"id":474},"dsh-message-gatewayプラグインの内部アーキテクチャ",[430,476,477,479],{},[448,478,446],{},"プラグインのアーキテクチャは、大きく2つの領域に分かれています：",[481,482,483,515],"ul",{},[484,485,486,489,490,494,495,498,499,502,503,506,507,510,511,514],"li",{},[448,487,488],{},"ホスト側","（Node環境）：",[491,492,493],"code",{},"gateway-store","（認証情報管理、",[491,496,497],{},"~\u002F.dsh\u002Fgateway.json","）、",[491,500,501],{},"platforms.ts","（プラットフォーム定義と接続テスト）、",[491,504,505],{},"routes.ts","（",[491,508,509],{},"\u002Fgateway\u002F*","エンドポイント）、および",[491,512,513],{},"bridge-manager.ts","（常駐ブリッジ：チャットごとの独立エージェントセッションおよびストリーミング応答管理）。",[484,516,517,520,521,524],{},[448,518,519],{},"クライアント側","（ブラウザ）：サイドバーの「",[448,522,523],{},"Message platforms","」設定ページ（認証情報の登録、接続確認、ステータス監視を担当）。",[430,526,527],{},"新しいプラットフォームを追加する際の実装手順は以下の3ステップです：",[529,530,531,549,563],"ol",{},[484,532,533,536,537,540,541,544,545,548],{},[448,534,535],{},"ブリッジクラスの作成","：",[491,538,539],{},"wecom-bridge.ts","をベースに、",[491,542,543],{},"start\u002Fstop\u002Fstatus","メソッドおよび",[491,546,547],{},"onText(text, frame)","コールバックを実装。",[484,550,551,554,555,558,559,562],{},[448,552,553],{},"bridge-managerへの配線","：既存のチャット別処理パイプライン（",[491,556,557],{},"ensureAgentForKey"," + ",[491,560,561],{},"pendingMap","）を再利用し、プラットフォーム固有の返信用シンクに接続。",[484,564,565,536,568,571,572,575,576,579,580,583,584,587],{},[448,566,567],{},"ストレージおよびルーティング設定",[491,569,570],{},"\u002Fgateway\u002Fsave","および",[491,573,574],{},"\u002Fgateway\u002Fdelete","内において、",[448,577,578],{},"認証情報の保存でブリッジを開始し、削除で停止","するよう制御。さらに",[491,581,582],{},"dsh web","起動時に自動再接続するための",[491,585,586],{},"autoStartXxx","フラグを構成。",[472,589,591],{"id":590},"buzzブリッジの実装nostrプロトコルとイベントライフサイクル","Buzzブリッジの実装：Nostrプロトコルとイベントライフサイクル",[430,593,594,595,598],{},"Buzzブリッジの実装には",[448,596,597],{},"DeepSeek Harness","本体が活用されました。本実装は以下のNostrプロトコル仕様に厳密に準拠しています：",[600,601,602,617],"table",{},[603,604,605],"thead",{},[606,607,608,614],"tr",{},[609,610,611],"th",{},[448,612,613],{},"項目",[609,615,616],{},"仕様・動作詳細",[618,619,620,643,661,688,705,730,755,776,790,804,823,840,854],"tbody",{},[606,621,622,628],{},[623,624,625],"td",{},[448,626,627],{},"トランスポート",[623,629,630,631,634,635,638,639,642],{},"NIP-42認証付きWebSocket接続（単一接続）；デフォルトは",[491,632,633],{},"ws:\u002F\u002Flocalhost:3000","；",[491,636,637],{},"http(s):\u002F\u002F","は自動的に",[491,640,641],{},"ws(s):\u002F\u002F","へ正規化",[606,644,645,650],{},[623,646,647],{},[448,648,649],{},"認証",[623,651,652,653,656,657,660],{},"AUTHイベント ",[491,654,655],{},"kind 22242","、タグ ",[491,658,659],{},"[[\"relay\", url], [\"challenge\", challenge]]","、空のコンテンツ、エージェント秘密鍵で署名",[606,662,663,668],{},[623,664,665],{},[448,666,667],{},"購読（Subscription）",[623,669,670,536,673,676,677,680,681,684,685],{},[448,671,672],{},"チャンネルスコープ",[491,674,675],{},"REQ {\"kinds\":[9], \"#h\":[\u003Cuuid>]}","（チャンネルごとに1つのREQ）。広域な",[491,678,679],{},"kinds:[9]","はEOSEを受け取りますがイベントは配信されず、複数値の",[491,682,683],{},"#h","フィルターは",[448,686,687],{},"無効",[606,689,690,695],{},[623,691,692],{},[448,693,694],{},"チャンネル検出",[623,696,697,698,506,701,704],{},"チャンネルメタデータ取得用の過去ログ問い合わせ ",[491,699,700],{},"REQ {kinds:[39000]}",[491,702,703],{},"type == \"dm\"","でダイレクトメッセージを判別）",[606,706,707,712],{},[623,708,709],{},[448,710,711],{},"メンバーシップ管理",[623,713,714,715,718,719,721,722,725,726,729],{},"リアルタイム購読 ",[491,716,717],{},"REQ {kinds:[44100,44101], \"#p\":[自公開鍵], since: now-60s}"," — 44100=追加、44101=離脱（",[491,720,430],{},"+",[491,723,724],{},"h","タグを含む）。メンバー変更時は",[448,727,728],{},"再接続なし","で購読状態を即時更新",[606,731,732,737],{},[623,733,734],{},[448,735,736],{},"チャットイベント",[623,738,739,742,743,746,747,750,751,754],{},[491,740,741],{},"kind 9","（タグ ",[491,744,745],{},"[\"h\", channel]","、任意指定で ",[491,748,749],{},"[\"e\", replyTo]",", ",[491,752,753],{},"[\"p\", mention]","）",[606,756,757,762],{},[623,758,759],{},[448,760,761],{},"インプレース編集",[623,763,764,506,767,558,769,772,773,775],{},[491,765,766],{},"kind 40003",[491,768,724],{},[491,770,771],{},"e","→対象ID）；コンテンツを全置換；リレーの上限64 KBに基づきペイロードは≤ 60,000 Bに制御；長文応答は分割（チャンク0は置換編集、超過分はスレッド形式の",[491,774,741],{},"で追加）",[606,777,778,783],{},[623,779,780],{},[448,781,782],{},"CLOSEDフレーム制御",[623,784,785,786,789],{},"AUTH前の",[491,787,788],{},"auth-required","は正常な初期化動作（AUTH完了後に購読再開）；AUTH後は制限付き再試行（最大3回、0\u002F1\u002F2秒バックオフ）；再接続時は全ステートを再構築",[606,791,792,797],{},[623,793,794],{},[448,795,796],{},"リレー取得上限",[623,798,799,800,803],{},"購読あたり最大2000件の履歴イベント（",[491,801,802],{},"since","指定時も含め、常に最新順で取得）",[606,805,806,811],{},[623,807,808],{},[448,809,810],{},"メンション判定",[623,812,813,814,816,817,819,820,822],{},"受信した",[491,815,741],{},"の処理条件：(a) ",[491,818,430],{},"タグに自公開鍵が含まれる、(b) チャンネルがDM、(c) ",[491,821,771],{},"参照が自身のイベント（スレッド追跡）。自公開鍵の発信は無視（無限ループ防止）",[606,824,825,830],{},[623,826,827],{},[448,828,829],{},"送信メンション",[623,831,832,833,836,837,839],{},"送信テキストはそのまま発行（リレー側での",[491,834,835],{},"@","構文検証はなし）；",[491,838,430],{},"タグには入力送信者＋言及された他の公開鍵を最大7件まで格納（合計最大8件）",[606,841,842,847],{},[623,843,844],{},[448,845,846],{},"ダイレクトメッセージ",[623,848,849,850,853],{},"リレーローカルの平文チャンネル（",[491,851,852],{},"type: \"dm\"","メタデータ）として処理 — 本ブリッジではNIP-04\u002F44暗号化は非使用",[606,855,856,861],{},[623,857,858],{},[448,859,860],{},"添付ファイル（受信）",[623,862,863,864,506,867,750,870,750,873,876],{},"NIP-92 ",[491,865,866],{},"imeta",[491,868,869],{},"url",[491,871,872],{},"sha256",[491,874,875],{},"m","）→ 標準HTTP(S)でダウンロードしSHA-256検証、20 MB上限、1メッセージあたり最大4点；送信画像の公開は現行未サポート",[430,878,879],{},"Buzzブリッジのブートストラップ接続フローは以下の通りです：",[433,881],{"src":882,"alt":883},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-bootstrap.webp","Buzzブリッジのブートストラップ接続とNIP-42認証プロセスを示すシーケンス図",[885,886,888],"h3",{"id":887},"nostrインプレース編集kind-40003によるリアルタイムストリーミング","Nostrインプレース編集（Kind 40003）によるリアルタイムストリーミング",[430,890,891,892,895],{},"Nostrプロトコルにはネイティブな入力中インジケーターが存在せず、イベントは追記専用です。応答の体感速度とインタラクティブ性を高めるため、Buzzブリッジは",[448,893,894],{},"インプレース編集を用いた疑似ストリーミング","を実現しています：",[433,897],{"src":898,"alt":899},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-reply.webp","kind 40003イベントによる逐次インプレース編集でストリーミング応答を再現するフロー図",[481,901,902],{},[484,903,904],{},[905,906,907,908,910,911,913],"em",{},"Buzzブリッジはまずプレースホルダーとなる",[491,909,741],{},"イベントを発行し、エージェントの思考出力に伴ってレートリミットされた",[491,912,766],{},"インプレース編集イベントで段階的にメッセージを書き換えます。そしてエージェントの推論完了時に最終版を確定します。これはTelegramやDiscordブリッジで採用されている実績ある設計パターンです。",[885,915,917],{"id":916},"チャットコマンドを通じたdeepseek-harnessワークスペースの連動","チャットコマンドを通じたDeepSeek Harnessワークスペースの連動",[430,919,920,921,924,925,928],{},"DSH Web UIにおける「ワークスペース」機能は、内部の",[491,922,923],{},"workspaceRegistry","サービス（",[491,926,927],{},"@deepseek-ai\u002Fdsh-workspace","）によって制御されています：",[930,931,935],"pre",{"className":932,"code":933,"language":934,"meta":425,"style":425},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const existing = await ctx.workspaceRegistry.resolveByPath(request.path);\n","typescript",[491,936,937],{"__ignoreMap":425},[938,939,942,946,950,954,958,961,964,966,968,972,975,977,980],"span",{"class":940,"line":941},"line",1,[938,943,945],{"class":944},"spNyl","const",[938,947,949],{"class":948},"sTEyZ"," existing ",[938,951,953],{"class":952},"sMK4o","=",[938,955,957],{"class":956},"s7zQu"," await",[938,959,960],{"class":948}," ctx",[938,962,963],{"class":952},".",[938,965,923],{"class":948},[938,967,963],{"class":952},[938,969,971],{"class":970},"s2Zo4","resolveByPath",[938,973,974],{"class":948},"(request",[938,976,963],{"class":952},[938,978,979],{"class":948},"path)",[938,981,982],{"class":952},";\n",[430,984,985,986,989],{},"Buzzブリッジはチャットコマンド",[491,987,988],{},"\u002Fworkspace \u003Cフォルダパス>","を提供し、ローカルに実在するディレクトリをDSHへ登録できます。ゲートウェイ経由で作成された新規セッションはすべてこのフォルダに関連付けられ、Web UI上にも即座に反映されます。",[433,991],{"src":992,"alt":993},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace.webp","ゲートウェイ経由のチャットコマンドからDeepSeek Harnessワークスペースを登録する連携アーキテクチャ図",[430,995,996],{},"設計上の3つの重要ポイント：",[481,998,999,1009,1018],{},[484,1000,1001,1004,1005,1008],{},[448,1002,1003],{},"フォルダ切り替え＝新規セッション開始","：作業ディレクトリ（",[491,1006,1007],{},"cwd","）はセッション作成時にヘッダーへ固定記録されるため、途中で動的に変更することはできません。",[484,1010,1011,536,1014,1017],{},[448,1012,1013],{},"フォルダの実在が必須",[491,1015,1016],{},"create","処理は存在しないパスの指定を即時エラーとして拒否します。",[484,1019,1020,1023,1024,1027],{},[448,1021,1022],{},"セキュリティ配慮","：すべてのセッションは",[448,1025,1026],{},"auto-approve","（自動承認）ポリシーで稼働するため、指定フォルダ配下のファイルに対して完全なアクセス権が付与されます。",[472,1029,1030],{"id":1030},"インストールと詳細設定のステップバイステップ手順",[529,1032,1033],{},[484,1034,1035],{},"ターミナルで以下のコマンドを実行します：",[930,1037,1041],{"className":1038,"code":1039,"language":1040,"meta":425,"style":425},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dsh plugin --profile web add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n\n# Start DSH web\ndsh web\n","bash",[491,1042,1043,1065,1072,1079],{"__ignoreMap":425},[938,1044,1045,1049,1053,1056,1059,1062],{"class":940,"line":941},[938,1046,1048],{"class":1047},"sBMFI","dsh",[938,1050,1052],{"class":1051},"sfazB"," plugin",[938,1054,1055],{"class":1051}," --profile",[938,1057,1058],{"class":1051}," web",[938,1060,1061],{"class":1051}," add",[938,1063,1064],{"class":1051}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fdsh-message-gateway.git\n",[938,1066,1068],{"class":940,"line":1067},2,[938,1069,1071],{"emptyLinePlaceholder":1070},true,"\n",[938,1073,1075],{"class":940,"line":1074},3,[938,1076,1078],{"class":1077},"sHwdD","# Start DSH web\n",[938,1080,1082,1084],{"class":940,"line":1081},4,[938,1083,1048],{"class":1047},[938,1085,1086],{"class":1051}," web\n",[529,1088,1089],{"start":1067},[484,1090,1091,1092,1094],{},"ブラウザでDSH Web UIが開いたら、左側メニューの「",[448,1093,523],{},"」アイコンをクリックします：",[430,1096,1097],{},[433,1098],{"alt":1099,"src":1100},"DeepSeek Harness Web UIのサイドバーに表示されたMessage platforms設定アイコン","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-message-platforms-sidebar-icon.webp",[529,1102,1103],{"start":1074},[484,1104,1105,1106,1109],{},"左側リストから「",[448,1107,1108],{},"Buzz","」を選択します：",[430,1111,1112],{},[433,1113],{"alt":1114,"src":1115},"DeepSeek HarnessメッセージゲートウェイにおけるBuzzブリッジの設定管理画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-message-gateway-buzz-config-panel.webp",[529,1117,1118,1129,1139],{"start":1081},[484,1119,1120,1121,1124,1125,1128],{},"「",[448,1122,1123],{},"Generate keypair","」をクリックしてNostrキーペアを生成します。表示された公開鍵（",[491,1126,1127],{},"npub","）を安全な場所にコピーしてください。",[484,1130,1120,1131,1134,1135,1138],{},[448,1132,1133],{},"Relay URL","」および購読対象のチャンネルUUIDを指定する「",[448,1136,1137],{},"Channels","」を入力します。",[484,1140,1120,1141,1144],{},[448,1142,1143],{},"Save","」ボタンをクリックします。",[430,1146,1147,1148,1151,1152,1155,1156,1158],{},"保存を実行すると認証情報が記録され、",[448,1149,1150],{},"ブリッジが即時起動","します。秘密鍵（",[491,1153,1154],{},"nsec","）は最重要機密として扱われ、ローカルの",[491,1157,497],{},"内にのみ安全に保存されます。",[885,1160,1162],{"id":1161},"buzz-nostrリレーへのエージェント公開鍵登録","Buzz Nostrリレーへのエージェント公開鍵登録",[430,1164,1165,1168,1169,1171],{},[448,1166,1167],{},"DSHアシスタントをリレーの正規メンバーとして追加します。"," 先ほど生成した公開鍵（",[491,1170,1127],{},"）を指定して実行します：",[930,1173,1175],{"className":1038,"code":1174,"language":1040,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub123123123\n",[491,1176,1177],{"__ignoreMap":425},[938,1178,1179,1182,1185,1188,1191,1194,1197,1200],{"class":940,"line":941},[938,1180,1181],{"class":1047},"docker",[938,1183,1184],{"class":1051}," compose",[938,1186,1187],{"class":1051}," exec",[938,1189,1190],{"class":1051}," relay",[938,1192,1193],{"class":1051}," buzz-admin",[938,1195,1196],{"class":1051}," add-member",[938,1198,1199],{"class":1051}," --pubkey",[938,1201,1202],{"class":1051}," npub123123123\n",[430,1204,1205,1208,1209,1212,1213,1216,1217,1219,1220,1223,1224,1227],{},[448,1206,1207],{},"アシスタントを特定のチャンネルへ招待します。"," リレーへ追加した段階では、まだ各チャンネル内での検索や発言はできません。",[491,1210,1211],{},"buzz-cli","を使用してチャンネルへ追加する際、",[491,1214,1215],{},"--pubkey","引数には",[491,1218,1127],{},"ではなく",[448,1221,1222],{},"HEX形式","の公開鍵を指定する必要があります（",[491,1225,1226],{},"buzz-admin add-member","の実行結果にHEX値が出力されます）：",[930,1229,1231],{"className":1038,"code":1230,"language":1040,"meta":425,"style":425},"buzz channels add-member --channel \u003CCHANNEL_UUID> --pubkey \u003CAGENT_HEX> --role member\n",[491,1232,1233],{"__ignoreMap":425},[938,1234,1235,1238,1241,1243,1246,1249,1252,1255,1258,1260,1262,1265,1268,1270,1273],{"class":940,"line":941},[938,1236,1237],{"class":1047},"buzz",[938,1239,1240],{"class":1051}," channels",[938,1242,1196],{"class":1051},[938,1244,1245],{"class":1051}," --channel",[938,1247,1248],{"class":952}," \u003C",[938,1250,1251],{"class":1051},"CHANNEL_UUI",[938,1253,1254],{"class":948},"D",[938,1256,1257],{"class":952},">",[938,1259,1199],{"class":1051},[938,1261,1248],{"class":952},[938,1263,1264],{"class":1051},"AGENT_HE",[938,1266,1267],{"class":948},"X",[938,1269,1257],{"class":952},[938,1271,1272],{"class":1051}," --role",[938,1274,1275],{"class":1051}," member\n",[461,1277],{"description":1278,"image":464,"image-alt":465,"label":1279,"min-read":1280,"title":1281,"to":1282},"Nostrチャンネル、メンバーキー、AIエージェントの権限を管理するためのbuzz-cliのインストールと設定手順を解説します。","CLIガイド","5","buzz-cliのインストールと使用方法","\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#install-buzz-cli",[430,1284,1285,1287],{},[491,1286,1211],{},"を使用して、Nostrリレー上のDSHアシスタントの表示名を分かりやすい名前に更新します：",[430,1289,1290],{},[433,1291],{"alt":1292,"src":1293},"buzz-cliを使用してNostrリレー上のDSHアシスタント表示名を更新する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-assistant-buzz-cli-profile-update.webp",[430,1295,1296,1297,1300],{},"DSHアシスタントへ",[448,1298,1299],{},"Wave","（BuzzのDM挨拶アクション）を送信します。アシスタントから応答が返れば接続成功です：",[430,1302,1303],{},[433,1304],{"alt":1305,"src":1306},"Buzz内でDSHアシスタントにWaveメッセージをDM送信して接続テストを行う様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-dm-wave-greeting-reply.webp",[430,1308,1309],{},[905,1310,1311],{},"DSHアシスタントへDMとしてWaveを送信 — ブリッジが正常に応答している様子。",[885,1313,1315,1318],{"id":1314},"workspaceによるローカルフォルダ連携の有効化",[491,1316,1317],{},"\u002Fworkspace","によるローカルフォルダ連携の有効化",[430,1320,1321,1322,1325,1326,1329,1330,1332],{},"デフォルトではセキュリティ保護のため",[491,1323,1324],{},"allowWorkspace","設定が",[491,1327,1328],{},"false","になっているため、初回実行時の",[491,1331,1317],{},"コマンドは拒絶されます：",[430,1334,1335],{},[433,1336],{"alt":1337,"src":1338},"allowWorkspaceが無効な状態で\u002Fworkspaceコマンドを実行した際のエラー通知画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-rejected-error.webp",[430,1340,1341,1344,1345,1347],{},[491,1342,1343],{},"~\u002F.dsh\u002Fprofiles\u002Fweb\u002Fcordis.patch.yml","を編集して機能を有効化し、",[491,1346,582],{},"を再起動します：",[930,1349,1353],{"className":1350,"code":1351,"language":1352,"meta":425,"style":425},"language-yml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","- id: ui-message-gateway\n  config:\n    allowWorkspace: true\n","yml",[491,1354,1355,1370,1378],{"__ignoreMap":425},[938,1356,1357,1360,1364,1367],{"class":940,"line":941},[938,1358,1359],{"class":952},"-",[938,1361,1363],{"class":1362},"swJcz"," id",[938,1365,1366],{"class":952},":",[938,1368,1369],{"class":1051}," ui-message-gateway\n",[938,1371,1372,1375],{"class":940,"line":1067},[938,1373,1374],{"class":1362},"  config",[938,1376,1377],{"class":952},":\n",[938,1379,1380,1383,1385],{"class":940,"line":1074},[938,1381,1382],{"class":1362},"    allowWorkspace",[938,1384,1366],{"class":952},[938,1386,1388],{"class":1387},"sfNiH"," true\n",[430,1390,1391],{},"再起動後の画面：",[430,1393,1394],{},[433,1395],{"alt":1396,"src":1397},"Buzz内で\u002Fworkspaceコマンドを実行しワークスペース登録が成功した確認画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-buzz-workspace-command-success-confirmation.webp",[430,1399,1400,1401,1404],{},"重要な注意点：この指定は、ワークスペースフォルダ（スクリーンショット内の",[491,1402,1403],{},"TechVoyage","）がデフォルトのユーザーホーム配下に存在することを前提としています。それ以外の階層を指定する場合はフルパスで入力してください。Buzz経由で登録されたセッションは、DeepSeek Harness Web UI上にも連動して表示されます。",[430,1406,1407],{},[433,1408],{"alt":1409,"src":1410},"Buzzから自動同期されDeepSeek Harness Web UI上に表示された作業セッション","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002Fdsh-web-ui-synced-workspace-session.webp",[885,1412,1414],{"id":1413},"buzz上で利用可能なコマンド一覧","Buzz上で利用可能なコマンド一覧",[430,1416,1417],{},"他プラットフォームで利用可能な主要コマンドは、Buzz環境でも完全に対応しています：",[600,1419,1420,1430],{},[603,1421,1422],{},[606,1423,1424,1427],{},[609,1425,1426],{},"コマンド",[609,1428,1429],{},"機能概要",[618,1431,1432,1442,1452,1462,1472,1482,1492,1502,1512,1533,1553],{},[606,1433,1434,1439],{},[623,1435,1436],{},[491,1437,1438],{},"\u002Fworkspace \u003Cfolder>",[623,1440,1441],{},"既存のフォルダをチャットの作業スペースとして登録（設定ファイルでの事前有効化が必要）",[606,1443,1444,1449],{},[623,1445,1446],{},[491,1447,1448],{},"\u002Fhelp",[623,1450,1451],{},"利用可能なコマンド一覧を表示",[606,1453,1454,1459],{},[623,1455,1456],{},[491,1457,1458],{},"\u002Ftime",[623,1460,1461],{},"現在のサーバー時刻を表示",[606,1463,1464,1469],{},[623,1465,1466],{},[491,1467,1468],{},"\u002Fnew",[623,1470,1471],{},"新しいクリーンなセッションを開始",[606,1473,1474,1479],{},[623,1475,1476],{},[491,1477,1478],{},"\u002Fclear",[623,1480,1481],{},"現在の会話履歴をクリア",[606,1483,1484,1489],{},[623,1485,1486],{},[491,1487,1488],{},"\u002Fstatus",[623,1490,1491],{},"現在のブリッジ接続ステータスを表示",[606,1493,1494,1499],{},[623,1495,1496],{},[491,1497,1498],{},"\u002Fstats",[623,1500,1501],{},"チャット数および全プラットフォームのブリッジ稼働状態を表示（Buzzを含む）",[606,1503,1504,1509],{},[623,1505,1506],{},[491,1507,1508],{},"\u002Fcommands",[623,1510,1511],{},"全コマンドの詳細な説明を表示",[606,1513,1514,1519],{},[623,1515,1516],{},[491,1517,1518],{},"@path\u002Fto\u002Ffile",[623,1520,1521,1522,1524,1525,1528,1529,1532],{},"Webの@メンションと同様に機能：モデルがワークスペース相対パスでファイルを読み込み。単体の",[491,1523,835],{},"、",[491,1526,1527],{},"@prefix","、または",[491,1530,1531],{},"\u002Ffiles \u003Cprefix>","で一致する候補を一覧表示",[606,1534,1535,1540],{},[623,1536,1537],{},[491,1538,1539],{},"\u002Fmodel",[623,1541,1542,1545,1546,1548,1549,1552],{},[491,1543,1544],{},"[provider model effort]"," — 稼働中のLLMカタログと検証の上、モデルおよび推論レベルを変更。",[491,1547,1539],{},"単体で選択肢一覧、",[491,1550,1551],{},"\u002Fmodel reset","で初期設定にリセット",[606,1554,1555,1560],{},[623,1556,1557],{},[491,1558,1559],{},"\u002Feffort",[623,1561,1562,1565,1566,1569],{},[491,1563,1564],{},"\u003Cid>"," モデルの推論エフォート値のみを調整。",[491,1567,1568],{},"\u002Feffort reset","でデフォルト値に戻す",[885,1571,1572],{"id":1572},"セキュリティ設計の要点",[481,1574,1575,1587,1600],{},[484,1576,1577,536,1580,1582,1583,1586],{},[448,1578,1579],{},"nsec（秘密鍵）の厳格管理",[491,1581,497],{},"内でのみ保管（パーミッション0600、アトミック書き込み）。",[491,1584,1585],{},"\u002Fgateway\u002Flist","などのAPIやログに出力されることは一切ありません。",[484,1588,1589,1592,1593,506,1596,1599],{},[448,1590,1591],{},"暗号検証の徹底","：受信したすべてのイベントは、エージェントへ渡る前に",[448,1594,1595],{},"署名検証",[491,1597,1598],{},"verifyEvent","）、重複排除、自己発信フィルター、メンション検証を通過します。",[484,1601,1602,1605,1606,1609],{},[448,1603,1604],{},"ワークスペース登録の二重防御","：ゲートウェイセッションが自動承認で動作するため、誤ったフォルダ公開を防ぐ目的で明示的な設定有効化（",[491,1607,1608],{},"allowWorkspace: true","）を必須としています。",[472,1611,1613],{"id":1612},"まとめbuzzによる分散型aiコラボレーションの実現","まとめ：Buzzによる分散型AIコラボレーションの実現",[430,1615,1616,1618],{},[491,1617,446],{},"にBuzzを追加する上での最大の技術的挑戦は、Nostrプロトコルが要求する規約の厳密なハンドリングにありました。既存のプラグイン設計がセッション管理やコマンドルーティングを美しく抽象化していたため、イベントの送受信と逐次編集ストリーミングが確立されてからは、極めてスムーズかつ堅牢に稼働させることができました。",[472,1620,1622],{"id":1621},"参考リンク","参考リンク：",[481,1624,1625,1633,1641],{},[484,1626,1627,1632],{},[441,1628,1631],{"href":1629,"rel":1630},"https:\u002F\u002Fgithub.com\u002Fa792883583\u002Fdsh-message-gateway\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture.md",[445],"dsh-message-gateway architecture guide"," — アーキテクチャガイド、拡張レシピ、セキュリティノート",[484,1634,1635,1640],{},[441,1636,1639],{"href":1637,"rel":1638},"https:\u002F\u002Fgithub.com\u002Fnbd-wtf\u002Fnostr-tools",[445],"nostr-tools"," — 内部で使用されている主要Nostrライブラリ",[484,1642,1643,1648],{},[441,1644,1647],{"href":1645,"rel":1646},"https:\u002F\u002Fgithub.com\u002Fbytedance\u002Fdeer-flow\u002Fblob\u002Fmain\u002Fbackend\u002Fdocs\u002FIM_CHANNEL_CONNECTIONS.md",[445],"deer-flow IM channel connections"," — インスタントメッセージング接続パターンの設計資料",[1650,1651,1652],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":425,"searchDepth":1067,"depth":1074,"links":1654},[1655,1656,1660,1667,1668],{"id":474,"depth":1067,"text":474},{"id":590,"depth":1067,"text":591,"children":1657},[1658,1659],{"id":887,"depth":1074,"text":888},{"id":916,"depth":1074,"text":917},{"id":1030,"depth":1067,"text":1030,"children":1661},[1662,1663,1665,1666],{"id":1161,"depth":1074,"text":1162},{"id":1314,"depth":1074,"text":1664},"\u002Fworkspaceによるローカルフォルダ連携の有効化",{"id":1413,"depth":1074,"text":1414},{"id":1572,"depth":1074,"text":1572},{"id":1612,"depth":1067,"text":1613},{"id":1621,"depth":1067,"text":1622},[1670,1671,1237,1672],"ai-agents","collaboration","deepseek-harness","2026-09-30","DeepSeek HarnessをNostrプロトコル経由でBlockのAI協働ワークスペースBuzzに接続する詳細手順を解説。NIP-42認証やWebSocket接続、kind 40003による逐次編集ストリーミング、チャンネル単位の自律型エージェント管理、ローカル作業環境コマンド連携までを完全網羅。","md","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FBringing%20Buzz%20to%20DeepSeek%20Harness\u002FJA-Bringing-Buzz-to-DeepSeek-Harness.webp","深みのあるインディゴとアンバーのアクセントが効いたプレミアムな16:9のテックカード。DeepSeek HarnessをNostrリレーブリッジ経由でBlock Buzzに接続する方法を表現し、洗練されたガラスモーフ調パネルの中央にタイポグラフィを配置。",{"schemaOrg":1679,"robots":1704,"sitemap":1705},[1680,1682],{"@type":1681,"headline":424,"description":1674,"image":1676},"TechArticle",{"@type":1683,"name":424,"description":1674,"image":1676,"step":1684},"HowTo",[1685,1689,1692,1695,1698,1701],{"@type":1686,"name":1687,"text":1688},"HowToStep","フェーズ1：ゲートウェイプラグインの導入","dsh-message-gatewayプラグインをインストールしてdsh webを起動します。",{"@type":1686,"name":1690,"text":1691},"フェーズ2：Message platforms設定の開始","DSH Web UIを開き、サイドバーからMessage platforms設定へ移動します。",{"@type":1686,"name":1693,"text":1694},"フェーズ3：Buzzブリッジの接続設定","Nostrキーペアを生成し、Relay URLと購読チャンネルを入力します。",{"@type":1686,"name":1696,"text":1697},"フェーズ4：Nostrリレーへのエージェント登録","buzz-adminを使用してDSHアシスタントをBuzzリレーのメンバーとして追加します。",{"@type":1686,"name":1699,"text":1700},"フェーズ5：特定チャンネルへの参加","buzz-cliを使用してHEX形式の公開鍵をチャンネルに追加します。",{"@type":1686,"name":1702,"text":1703},"フェーズ6：ローカル作業フォルダ連携の有効化","cordis.patch.ymlでallowWorkspaceを有効化し、フォルダ連携を許可します。","index, follow",{"lastmod":1673},15,{"title":1708,"description":1674,"ogTitle":424,"ogDescription":1674,"twitterTitle":424,"twitterDescription":1674},"DeepSeek Harness Buzzプラグイン導入：Nostrプロトコル中継リレー接続の構築手順","ja\u002Farticle\u002Fbringing-buzz-to-deepseek-harness",[597,1108,1711,1712,446],"Nostr","AIエージェント",null,"G3P6ZGHDF8ind6nFnnP4iRMS71Dlm2AfulrpNfUFCJE",{"id":1716,"title":1717,"author":425,"body":1718,"category":2608,"date":2610,"description":2611,"extension":1675,"image":2612,"imageAlt":2613,"isPublished":1070,"meta":2614,"minRead":1933,"navigation":1070,"path":187,"seo":2648,"stem":2650,"tags":2651,"updatedAt":2647,"__hash__":2655},"article\u002Fja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp.md","Cloudflare WARPでHermes Agentをプライベートネットワークに公開する方法",{"type":427,"value":1719,"toc":2590},[1720,1735,1745,1748,1751,1763,1766,1774,1777,1781,1830,1834,1973,1977,2009,2013,2016,2082,2085,2121,2124,2151,2155,2165,2169,2207,2296,2300,2305,2322,2331,2411,2416,2462,2466,2511,2526,2530,2574,2577,2587],[430,1721,1722,1723,1726,1727,1730,1731,1734],{},"パブリックインターネットに公開することなく、ノートパソコン、タブレット、スマートフォンなどの他のデバイスから",[448,1724,1725],{},"Hermes Agent","にアクセスしたい場合、よく課題に直面します。",[448,1728,1729],{},"Cloudflare WARP","と",[448,1732,1733],{},"Cloudflare Zero Trust","を活用することで、ファイアウォールのインバウンドポートを一切開くことなく、Hermes Agentをグローバルに公開することが可能になります。",[430,1736,1737,1738,1741,1742,1744],{},"以前のガイド「",[441,1739,1740],{"href":375},"リモートのLinux VPSサーバー環境にHermes Agentを導入・デプロイして常時運用する方法","」に従って設定済みであれば、Hermes Agentはすでに24時間稼働しているはずです。従来のVPNの煩雑な管理に対処する代わりに、今回は",[448,1743,1729],{},"クライアントを使用して、インターネット経由でHermes Agentをプライベートネットワークに公開します。",[472,1746,1747],{"id":1747},"アーキテクチャの理解",[430,1749,1750],{},"本構成で動作するコンポーネント：",[529,1752,1753,1758],{},[484,1754,1755,1757],{},[448,1756,1733],{},": ルーティングルールとアクセス権限（ポリシー）を定義するCloudflare의ダッシュボードです。",[484,1759,1760,1762],{},[448,1761,1729],{},": デバイス（VPS、ノートパソコン、スマートフォン）にインストールするクライアントアプリケーションです。プライベートネットワーク宛てのトラフィックを傍受し、安全にルーティングします。",[885,1764,1765],{"id":1765},"前提条件",[481,1767,1768,1771],{},[484,1769,1770],{},"VPS上でHermes Agentが稼働していること。",[484,1772,1773],{},"無料のCloudflareアカウント。",[472,1775,1776],{"id":1776},"ステップバイステップガイド",[885,1778,1780],{"id":1779},"ステップ-1-cloudflare-zero-trustのセットアップ","ステップ 1: Cloudflare Zero Trustのセットアップ",[529,1782,1783,1791,1798,1809,1816,1823],{},[484,1784,1785,1790],{},[441,1786,1789],{"href":1787,"rel":1788},"https:\u002F\u002Fdash.cloudflare.com\u002F",[445],"Cloudflare ダッシュボード","にログインします。",[484,1792,1793,1794],{},"左側のメニューから「Zero Trust」をクリックします。\n",[433,1795],{"alt":1796,"src":1797},"Zero Trustオプションが表示されたCloudflareダッシュボードの左サイドバーナビゲーションメニュー","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-left-menu.webp",[484,1799,1800,1801,1804,1805],{},"初めて利用する場合は、プランの選択（このセットアップには無料プランで十分です）とチーム名の設定（例：",[491,1802,1803],{},"ai-team","）を求められます。\n",[433,1806],{"alt":1807,"src":1808},"初回設定のCloudflare Zero Trustアカウントの作成とチームの命名処理","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-team-setup.webp",[484,1810,1811,1812],{},"「Access」をクリックし、「Policies」を選択して、ネットワークへのアクセス権を持つユーザーを定義するアクセスポリシーを作成します。\n",[433,1813],{"alt":1814,"src":1815},"新しく設定されたアクセス規則を表示しているCloudflare Zero Trustアクセス権限ポリシーページ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-access-policies-page.webp",[484,1817,1818,1819],{},"「Create new policy」をクリックします。\n",[433,1820],{"alt":1821,"src":1822},"Cloudflare Access policies page showing no policies added and a button to create a new policy.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-no-policies-create-button.png",[484,1824,1825,1826],{},"「Emails」を選択し、「Policy rules」の下にあなたのメールアドレスを入力します。\n",[433,1827],{"alt":1828,"src":1829},"Cloudflare Access policy rule configuration screen with an email address specified as the inclusion criteria.","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20secure%20NodeWarden%20at%20Cloudflare\u002Fcloudflare-access-policy-rule-email.png",[885,1831,1833],{"id":1832},"ステップ-2-vpsへのcloudflare-warpクライアントのセットアップ","ステップ 2: VPSへのCloudflare WARPクライアントのセットアップ",[529,1835,1836,1847,1854,1861,1864,1879,1882,1966],{},[484,1837,1838,1839,1842,1843,1846],{},"VPSのターミナルで ",[491,1840,1841],{},"sudo apt update"," と ",[491,1844,1845],{},"sudo apt install cloudflare-warp"," を実行します。",[484,1848,1849,1850,1853],{},"ターミナルで ",[491,1851,1852],{},"warp-cli registration new \u003CTEAM-NAME>"," を実行すると、URLが出力されます。",[484,1855,1856,1857,1860],{},"出力されたURL（例：",[491,1858,1859],{},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp","）をコピーし、ブラウザに貼り付けて認証を行います。",[484,1862,1863],{},"ステップ1のポリシー設定でメール認証を使用したため、メールアドレスを入力して認証を進めます。",[484,1865,1866,1867,1870,1871,1874,1875,1878],{},"ブラウザに「",[448,1868,1869],{},"Success","」ページが表示されたら、青い「",[448,1872,1873],{},"Open Cloudflare WARP","」ボタンを右クリックし、「",[448,1876,1877],{},"検証 (Inspect)","」を選択します。",[484,1880,1881],{},"ボタンのリンク内に表示されている長いトークンをコピーします。",[484,1883,1838,1884,1887,1888,1891,1892],{},[491,1885,1886],{},"warp-cli --accept-tos registration token \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\""," を実行し、VPSをCloudflare Zero Trustに接続します。",[1889,1890],"br",{},"Ubuntu 26で「Error: Failed to communicate with the WARP API」が発生した場合は、次のコマンドを実行します。",[930,1893,1895],{"className":1038,"code":1894,"language":1040,"meta":425,"style":425},"sudo systemctl restart warp-svc.service\n\n# Check status\nsudo systemctl status warp-svc.service\n\n# Run the warp-cli registration token again\nwarp-cli --accept-tos registration token   \"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>\"\n",[491,1896,1897,1911,1915,1920,1931,1936,1942],{"__ignoreMap":425},[938,1898,1899,1902,1905,1908],{"class":940,"line":941},[938,1900,1901],{"class":1047},"sudo",[938,1903,1904],{"class":1051}," systemctl",[938,1906,1907],{"class":1051}," restart",[938,1909,1910],{"class":1051}," warp-svc.service\n",[938,1912,1913],{"class":940,"line":1067},[938,1914,1071],{"emptyLinePlaceholder":1070},[938,1916,1917],{"class":940,"line":1074},[938,1918,1919],{"class":1077},"# Check status\n",[938,1921,1922,1924,1926,1929],{"class":940,"line":1081},[938,1923,1901],{"class":1047},[938,1925,1904],{"class":1051},[938,1927,1928],{"class":1051}," status",[938,1930,1910],{"class":1051},[938,1932,1934],{"class":940,"line":1933},5,[938,1935,1071],{"emptyLinePlaceholder":1070},[938,1937,1939],{"class":940,"line":1938},6,[938,1940,1941],{"class":1077},"# Run the warp-cli registration token again\n",[938,1943,1945,1948,1951,1954,1957,1960,1963],{"class":940,"line":1944},7,[938,1946,1947],{"class":1047},"warp-cli",[938,1949,1950],{"class":1051}," --accept-tos",[938,1952,1953],{"class":1051}," registration",[938,1955,1956],{"class":1051}," token",[938,1958,1959],{"class":952},"   \"",[938,1961,1962],{"class":1051},"https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fauth?token=\u003Ccopied_token>",[938,1964,1965],{"class":952},"\"\n",[484,1967,1968,1969],{},"Cloudflare Zero Trustダッシュボードに戻り、「Devices」をクリックします。VPSデバイスが表示されているはずです。\n",[433,1970],{"alt":1971,"src":1972},"Linux VPSが正常に接続されていることを確認するZero Trustデバイスダッシュボード","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-devices-vps-connected.webp",[885,1974,1976],{"id":1975},"ステップ-3-トラフィックのルーティング設定","ステップ 3: トラフィックのルーティング設定",[529,1978,1979,1986,1993,2000],{},[484,1980,1981,1982],{},"Devicesダッシュボードで、VPSのプロファイルをクリックします。\n",[433,1983],{"alt":1984,"src":1985},"登録されたVPSデバイスの詳細と分割トンネル設定へのアクセス画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-device-profile.webp",[484,1987,1988,1989],{},"下にスクロールして「Split Tunnels」セクションを見つけます。\n",[433,1990],{"alt":1991,"src":1992},"VPSプロフィール設定項目内のSplit Tunnels分割トンネルセクション","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-split-tunnels-section.webp",[484,1994,1995,1996],{},"「Manage」ボタンをクリックし、以下のように設定を構成します。必要に応じてIPアドレスを置き換えてください。\n",[433,1997],{"alt":1998,"src":1999},"Cloudflare設定での分割トンネルIPアドレスとホスト名の除外ルールの管理設定","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-zero-trust-manage-split-tunnels.webp",[484,2001,2002,1842,2005,2008],{},[491,2003,2004],{},"address",[491,2006,2007],{},"host"," を公開することで、トラフィックが同じプライベートネットワーク経由でサービスにルーティングされるようになります。",[885,2010,2012],{"id":2011},"ステップ-4-vpsでのファイアウォール設定","ステップ 4: VPSでのファイアウォール設定",[430,2014,2015],{},"ファイアウォールを有効にして、「100.96.0.0\u002F12」サブネットのみを許可し、他のすべてのパブリックな受信アクセスをブロックします。",[930,2017,2019],{"className":1038,"code":2018,"language":1040,"meta":425,"style":425},"sudo ufw enable \nsudo ufw default allow outgoing \nsudo ufw default deny incoming\nsudo ufw allow in from 100.96.0.0\u002F12\n",[491,2020,2021,2034,2051,2065],{"__ignoreMap":425},[938,2022,2023,2025,2028,2031],{"class":940,"line":941},[938,2024,1901],{"class":1047},[938,2026,2027],{"class":1051}," ufw",[938,2029,2030],{"class":1051}," enable",[938,2032,2033],{"class":948}," \n",[938,2035,2036,2038,2040,2043,2046,2049],{"class":940,"line":1067},[938,2037,1901],{"class":1047},[938,2039,2027],{"class":1051},[938,2041,2042],{"class":1051}," default",[938,2044,2045],{"class":1051}," allow",[938,2047,2048],{"class":1051}," outgoing",[938,2050,2033],{"class":948},[938,2052,2053,2055,2057,2059,2062],{"class":940,"line":1074},[938,2054,1901],{"class":1047},[938,2056,2027],{"class":1051},[938,2058,2042],{"class":1051},[938,2060,2061],{"class":1051}," deny",[938,2063,2064],{"class":1051}," incoming\n",[938,2066,2067,2069,2071,2073,2076,2079],{"class":940,"line":1081},[938,2068,1901],{"class":1047},[938,2070,2027],{"class":1051},[938,2072,2045],{"class":1051},[938,2074,2075],{"class":1051}," in",[938,2077,2078],{"class":1051}," from",[938,2080,2081],{"class":1051}," 100.96.0.0\u002F12\n",[430,2083,2084],{},"ローカルサービスが中断されないよう、ループバックトラフィックを許可します：",[930,2086,2088],{"className":1038,"code":2087,"language":1040,"meta":425,"style":425},"sudo ufw allow in on lo\nsudo ufw allow out on lo\n",[491,2089,2090,2106],{"__ignoreMap":425},[938,2091,2092,2094,2096,2098,2100,2103],{"class":940,"line":941},[938,2093,1901],{"class":1047},[938,2095,2027],{"class":1051},[938,2097,2045],{"class":1051},[938,2099,2075],{"class":1051},[938,2101,2102],{"class":1051}," on",[938,2104,2105],{"class":1051}," lo\n",[938,2107,2108,2110,2112,2114,2117,2119],{"class":940,"line":1067},[938,2109,1901],{"class":1047},[938,2111,2027],{"class":1051},[938,2113,2045],{"class":1051},[938,2115,2116],{"class":1051}," out",[938,2118,2102],{"class":1051},[938,2120,2105],{"class":1051},[430,2122,2123],{},"ファイアウォールをリロードし、ステータスを確認します：",[930,2125,2127],{"className":1038,"code":2126,"language":1040,"meta":425,"style":425},"sudo ufw reload \nsudo ufw status verbose\n",[491,2128,2129,2140],{"__ignoreMap":425},[938,2130,2131,2133,2135,2138],{"class":940,"line":941},[938,2132,1901],{"class":1047},[938,2134,2027],{"class":1051},[938,2136,2137],{"class":1051}," reload",[938,2139,2033],{"class":948},[938,2141,2142,2144,2146,2148],{"class":940,"line":1067},[938,2143,1901],{"class":1047},[938,2145,2027],{"class":1051},[938,2147,1928],{"class":1051},[938,2149,2150],{"class":1051}," verbose\n",[885,2152,2154],{"id":2153},"ステップ-5-hermes-agentをプライベートネットワークに公開する","ステップ 5: Hermes Agentをプライベートネットワークに公開する",[430,2156,2157,2160,2161,2164],{},[448,2158,2159],{},"Hermes Agent Web Dashboard","をプライベートネットワークに公開し、デフォルトの認証プロバイダである",[448,2162,2163],{},"Nous Research","を使用します。",[2166,2167,2168],"h4",{"id":2168},"認証プロバイダのセットアップ",[529,2170,2171,2179,2186,2193,2200],{},[484,2172,2173,2178],{},[441,2174,2177],{"href":2175,"rel":2176},"https:\u002F\u002Fportal.nousresearch.com",[445],"portal.nousresearch.com"," にアクセスし、アカウントを登録します。",[484,2180,2181,2182],{},"「Local Dashboards」を選択します。\n",[433,2183],{"alt":2184,"src":2185},"Nous ResearchポータルでのLocal Dashboardsローカルダッシュボードオプションの選択画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-local-dashboards-selection.webp",[484,2187,2188,2189],{},"「Register Dashboard」をクリックします。\n",[433,2190],{"alt":2191,"src":2192},"新しいダッシュボード項目を作成するためのRegister Dashboardボタンのクリック操作","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-dashboard.webp",[484,2194,2195,2196],{},"「Dashboard redirect URI」にVPSのプライベートネットワークIPアドレスを入力し、「Save」をクリックします。\n",[433,2197],{"alt":2198,"src":2199},"Nous ResearchポータルにおけるリダイレクトURIとしてのプライベートIPアドレスの登録処理","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fnous-portal-register-redirect-uri.webp",[484,2201,2202,2203,2206],{},"「OAuth client ID」をコピーし、",[491,2204,2205],{},"config.yaml"," ファイルに貼り付けます：",[930,2208,2212],{"className":2209,"code":2210,"language":2211,"meta":425,"style":425},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","dashboard:\n  theme: default\n  show_token_analytics: false\n  oauth:\n    client_id: agent:cmq02x7ha0002jk0ba3kfnb\n    portal_url: https:\u002F\u002Fportal.nousresearch.com\n  basic_auth:\n    username: ''\n    password_hash: ''\n","yaml",[491,2213,2214,2221,2231,2241,2248,2258,2268,2275,2286],{"__ignoreMap":425},[938,2215,2216,2219],{"class":940,"line":941},[938,2217,2218],{"class":1362},"dashboard",[938,2220,1377],{"class":952},[938,2222,2223,2226,2228],{"class":940,"line":1067},[938,2224,2225],{"class":1362},"  theme",[938,2227,1366],{"class":952},[938,2229,2230],{"class":1051}," default\n",[938,2232,2233,2236,2238],{"class":940,"line":1074},[938,2234,2235],{"class":1362},"  show_token_analytics",[938,2237,1366],{"class":952},[938,2239,2240],{"class":1387}," false\n",[938,2242,2243,2246],{"class":940,"line":1081},[938,2244,2245],{"class":1362},"  oauth",[938,2247,1377],{"class":952},[938,2249,2250,2253,2255],{"class":940,"line":1933},[938,2251,2252],{"class":1362},"    client_id",[938,2254,1366],{"class":952},[938,2256,2257],{"class":1051}," agent:cmq02x7ha0002jk0ba3kfnb\n",[938,2259,2260,2263,2265],{"class":940,"line":1938},[938,2261,2262],{"class":1362},"    portal_url",[938,2264,1366],{"class":952},[938,2266,2267],{"class":1051}," https:\u002F\u002Fportal.nousresearch.com\n",[938,2269,2270,2273],{"class":940,"line":1944},[938,2271,2272],{"class":1362},"  basic_auth",[938,2274,1377],{"class":952},[938,2276,2278,2281,2283],{"class":940,"line":2277},8,[938,2279,2280],{"class":1362},"    username",[938,2282,1366],{"class":952},[938,2284,2285],{"class":952}," ''\n",[938,2287,2289,2292,2294],{"class":940,"line":2288},9,[938,2290,2291],{"class":1362},"    password_hash",[938,2293,1366],{"class":952},[938,2295,2285],{"class":952},[2166,2297,2299],{"id":2298},"hermes-dashboardを自動起動するためのsystemd設定","Hermes Dashboardを自動起動するためのSystemd設定",[529,2301,2302],{},[484,2303,2304],{},"サービスファイルを作成します：",[930,2306,2310],{"className":2307,"code":2308,"language":2309,"meta":425,"style":425},"language-shell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n","shell",[491,2311,2312],{"__ignoreMap":425},[938,2313,2314,2316,2319],{"class":940,"line":941},[938,2315,1901],{"class":1047},[938,2317,2318],{"class":1051}," nano",[938,2320,2321],{"class":1051}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-dashboard.service\n",[529,2323,2324],{"start":1067},[484,2325,2326,2327,2330],{},"以下の構成を貼り付けます。必ず ",[491,2328,2329],{},"--host 0.0.0.0"," がコマンドに含まれていることを確認してください：",[930,2332,2336],{"className":2333,"code":2334,"language":2335,"meta":425,"style":425},"language-ini shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[Unit]\nDescription=Hermes Dashboard\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n","ini",[491,2337,2338,2343,2348,2353,2357,2362,2367,2372,2377,2382,2388,2394,2399,2405],{"__ignoreMap":425},[938,2339,2340],{"class":940,"line":941},[938,2341,2342],{},"[Unit]\n",[938,2344,2345],{"class":940,"line":1067},[938,2346,2347],{},"Description=Hermes Dashboard\n",[938,2349,2350],{"class":940,"line":1074},[938,2351,2352],{},"After=network.target\n",[938,2354,2355],{"class":940,"line":1081},[938,2356,1071],{"emptyLinePlaceholder":1070},[938,2358,2359],{"class":940,"line":1933},[938,2360,2361],{},"[Service]\n",[938,2363,2364],{"class":940,"line":1938},[938,2365,2366],{},"User=hermes\n",[938,2368,2369],{"class":940,"line":1944},[938,2370,2371],{},"WorkingDirectory=\u002Fhome\u002Fhermes\n",[938,2373,2374],{"class":940,"line":2277},[938,2375,2376],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes dashboard --host 0.0.0.0\n",[938,2378,2379],{"class":940,"line":2288},[938,2380,2381],{},"Restart=always\n",[938,2383,2385],{"class":940,"line":2384},10,[938,2386,2387],{},"RestartSec=10\n",[938,2389,2391],{"class":940,"line":2390},11,[938,2392,2393],{},"Environment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n",[938,2395,2397],{"class":940,"line":2396},12,[938,2398,1071],{"emptyLinePlaceholder":1070},[938,2400,2402],{"class":940,"line":2401},13,[938,2403,2404],{},"[Install]\n",[938,2406,2408],{"class":940,"line":2407},14,[938,2409,2410],{},"WantedBy=multi-user.target\n",[529,2412,2413],{"start":1074},[484,2414,2415],{},"サービスを有効化し、起動します：",[930,2417,2419],{"className":2307,"code":2418,"language":2309,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-dashboard\nsudo systemctl start hermes-dashboard\nsudo systemctl status hermes-dashboard\n",[491,2420,2421,2430,2441,2452],{"__ignoreMap":425},[938,2422,2423,2425,2427],{"class":940,"line":941},[938,2424,1901],{"class":1047},[938,2426,1904],{"class":1051},[938,2428,2429],{"class":1051}," daemon-reload\n",[938,2431,2432,2434,2436,2438],{"class":940,"line":1067},[938,2433,1901],{"class":1047},[938,2435,1904],{"class":1051},[938,2437,2030],{"class":1051},[938,2439,2440],{"class":1051}," hermes-dashboard\n",[938,2442,2443,2445,2447,2450],{"class":940,"line":1074},[938,2444,1901],{"class":1047},[938,2446,1904],{"class":1051},[938,2448,2449],{"class":1051}," start",[938,2451,2440],{"class":1051},[938,2453,2454,2456,2458,2460],{"class":940,"line":1081},[938,2455,1901],{"class":1047},[938,2457,1904],{"class":1051},[938,2459,1928],{"class":1051},[938,2461,2440],{"class":1051},[885,2463,2465],{"id":2464},"ステップ-6-デスクトップにcloudflare-warpクライアントをインストールする","ステップ 6: デスクトップにCloudflare WARPクライアントをインストールする",[529,2467,2468,2476,2479,2486,2493,2500],{},[484,2469,2470,2475],{},[441,2471,2474],{"href":2472,"rel":2473},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fwarp-client\u002Fget-started\u002F",[445],"Cloudflareのポータル","からCloudflare WARPクライアントをダウンロードします。",[484,2477,2478],{},"インストール後、Cloudflare WARPクライアントを開いて起動します。",[484,2480,2481,2482],{},"画面の指示に従ってログインします。\n",[433,2483],{"alt":2484,"src":2485},"デスクトップ端末に表示されたCloudflare WARPクライアントのログインプロンプト画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-prompt.webp",[484,2487,2488,2489],{},"ログインに成功すると、「Success」ページが表示されます。\n",[433,2490],{"alt":2491,"src":2492},"デスクトップでのCloudflare Zero Trustログイン成功後の認証完了通知用ウェブページ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-login-success.webp",[484,2494,2495,2496],{},"WARPクライアントがZero Trustチームに接続されていることが表示されるはずです。\n",[433,2497],{"alt":2498,"src":2499},"Zero Trustプライベートネットワークへのアクティブ接続を証明するデスクトップ用WARPクライアント","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-warp-desktop-client-connected.webp",[484,2501,2502,2503,2506,2507],{},"Webブラウザを開き、プライベートIP（例：",[491,2504,2505],{},"100.96.0.3","）を入力します。Hermes Web Dashboardが正常に読み込まれるはずです。\n",[433,2508],{"alt":2509,"src":2510},"デスクトップのブラウザからアクセスしたプライベートなHermes Agentウェブダッシュボード","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-desktop-view.webp",[2512,2513,2514],"blockquote",{},[430,2515,2516,2519,2520,2525],{},[448,2517,2518],{},"macOSユーザー向けのヒント:"," 複数のCloudflareアカウントにアクセスするためにWARPクライアントを使用している場合は、「",[448,2521,2522],{},[441,2523,2524],{"href":399},"MacのMDM構成プロファイルを用いて複数のCloudflare WARP組織を切り替える設定手順ガイド","」のクイックガイドをチェックして、アカウント間のシームレスな切り替えに役立ててください。",[885,2527,2529],{"id":2528},"ステップ-7-iosデバイスにcloudflare-warpクライアントをインストールする","ステップ 7: iOSデバイスにCloudflare WARPクライアントをインストールする",[529,2531,2532,2539,2547,2555,2563],{},[484,2533,2534,2535,2538],{},"App Storeから",[448,2536,2537],{},"Cloudflare One","をインストールします。",[484,2540,2541,2542],{},"Cloudflare Oneアプリを開き、画面の指示に従ってチーム名を入力します。\n",[433,2543],{"alt":2544,"src":2545,"width":2546},"iOSデバイスのCloudflare OneアプリにおけるCloudflare Zero Trustチーム名の入力プロンプト","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-team-name-prompt.webp",239,[484,2548,2549,2550],{},"上記のポリシー設定で登録したのと同じメールアドレスを使用してログインします。\n",[433,2551],{"alt":2552,"src":2553,"width":2554},"iOSに表示されたCloudflare Zero Trustのログイン用電子メール認証プロンプト画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-email-login.webp",229,[484,2556,2557,2558],{},"接続が完了すると、次のようになります：\n",[433,2559],{"alt":2560,"src":2561,"width":2562},"iOSモバイル端末の画面上でアクティブな接続状態を通知しているCloudflare Oneアプリ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fcloudflare-one-ios-client-connected.webp",322,[484,2564,2565,2566,2568,2569],{},"モバイルデバイスのWebブラウザを開き、プライベートIP ",[491,2567,2505],{}," を入力してHermes Web Dashboardにアクセスします。\n",[433,2570],{"alt":2571,"src":2572,"width":2573},"スマートフォンのモバイルブラウザ上にロードされたHermes Agentウェブダッシュボードの表示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002Fhermes-agent-dashboard-mobile-view.webp",345,[472,2575,2576],{"id":2576},"結論",[430,2578,2579,2580,2582,2583,2586],{},"ID（アイデンティティ）ポリシーを管理する",[448,2581,1733],{},"と、暗号化されたトンネル経由でトラフィックをルーティングする",[448,2584,2585],{},"WARP","クライアントを組み合わせることで、世界中のどこからでもお使いのデバイスからHermes Agentへ安全にアクセスできるようになりました。このセットアップにより、完全なリモート環境でプライベートなAIインフラを構築・運用するための、安全で堅牢な基盤が整いました。",[1650,2588,2589],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}",{"title":425,"searchDepth":1067,"depth":1074,"links":2591},[2592,2595,2607],{"id":1747,"depth":1067,"text":1747,"children":2593},[2594],{"id":1765,"depth":1074,"text":1765},{"id":1776,"depth":1067,"text":1776,"children":2596},[2597,2598,2599,2600,2601,2605,2606],{"id":1779,"depth":1074,"text":1780},{"id":1832,"depth":1074,"text":1833},{"id":1975,"depth":1074,"text":1976},{"id":2011,"depth":1074,"text":2012},{"id":2153,"depth":1074,"text":2154,"children":2602},[2603,2604],{"id":2168,"depth":1081,"text":2168},{"id":2298,"depth":1081,"text":2299},{"id":2464,"depth":1074,"text":2465},{"id":2528,"depth":1074,"text":2529},{"id":2576,"depth":1067,"text":2576},[1670,2609],"security","2026-07-09","ファイアウォールのインバウンドポートを開くことなく、Cloudflare WARPとZero Trustを使用してグローバルかつ安全にHermes Agentへアクセスし、プライベートネットワークに公開する方法を詳しく解説します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FJA-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","Cloudflare Zero TrustとWARPトンネルを使用してHermes Agentをプライベートネットワークに安全に公開",{"schemaOrg":2615,"robots":1704,"sitemap":2646},[2616],{"@type":1683,"headline":1717,"description":2611,"name":1717,"image":2612,"step":2617},[2618,2622,2626,2630,2634,2638,2642],{"@type":1686,"name":2619,"text":2620,"url":2621,"image":1797},"Cloudflare Zero Trustのセットアップ","Cloudflare ダッシュボードにログインします。 左側のメニューから「Zero Trust」をクリックします。 初めて利用する場合は、プランの選択（このセットアップには無料プランで十分です）とチーム名の設定（例：ai-team）を求められます。 「Access」をクリックし、「Policies」を選択して、ネットワークへのアクセス権を持つユーザーを定義するアクセスポリシーを作成します。 「Create new policy」をクリックします。 「Emails」を選択し、「Policy ru","#step-1",{"@type":1686,"name":2623,"text":2624,"url":2625,"image":1972},"VPSへのCloudflare WARPクライアントのセットアップ","VPSのターミナルで sudo apt update と sudo apt install cloudflare-warp を実行します。 ターミナルで warp-cli registration new \u003CTEAM-NAME> を実行すると、URLが出力されます。 出力されたURL（例：https:\u002F\u002F\u003Cteam>.cloudflareaccess.com\u002Fwarp）をコピーし、ブラウザに貼り付けて認証を行います。 ステップ1のポリシー設定でメール認証を使用したため、メールアドレスを入力して認","#step-2",{"@type":1686,"name":2627,"text":2628,"url":2629,"image":1985},"トラフィックのルーティング設定","Devicesダッシュボードで、VPSのプロファイルをクリックします。 下にスクロールして「Split Tunnels」セクションを見つけます。 「Manage」ボタンをクリックし、以下のように設定を構成します。必要に応じてIPアドレスを置き換えてください。 address と host を公開することで、トラフィックが同じプライベートネットワーク経由でサービスにルーティングされるようになります。","#step-3",{"@type":1686,"name":2631,"text":2632,"url":2633},"VPSでのファイアウォール設定","ファイアウォールを有効にして、「100.96.0.0\u002F12」サブネットのみを許可し、他のすべてのパブリックな受信アクセスをブロックします。 bash ローカルサービスが中断されないよう、ループバックトラフィックを許可します： bash ファイアウォールをリロードし、ステータスを確認します： bash","#step-4",{"@type":1686,"name":2635,"text":2636,"url":2637},"Hermes Agentをプライベートネットワークに公開する","Hermes Agent Web Dashboardをプライベートネットワークに公開し、デフォルトの認証プロバイダであるNous Researchを使用します。","#step-5",{"@type":1686,"name":2639,"text":2640,"url":2641,"image":2485},"デスクトップにCloudflare WARPクライアントをインストールする","CloudflareのポータルからCloudflare WARPクライアントをダウンロードします。 インストール後、Cloudflare WARPクライアントを開いて起動します。 画面の指示に従ってログインします。 ログインに成功すると、「Success」ページが表示されます。 WARPクライアントがZero Trustチームに接続されていることが表示されるはずです。 Webブラウザを開き、プライベートIP（例：100.96.0.3）を入力します。Hermes Web Dashboardが正常に","#step-6",{"@type":1686,"name":2643,"text":2644,"url":2645,"image":2545},"iOSデバイスにCloudflare WARPクライアントをインストールする","App StoreからCloudflare Oneをインストールします。 Cloudflare Oneアプリを開き、画面の指示に従ってチーム名を入力します。 上記のポリシー設定で登録したのと同じメールアドレスを使用してログインします。 接続が完了すると、次のようになります： モバイルデバイスのWebブラウザを開き、プライベートIP 100.96.0.3 を入力してHermes Web Dashboardにアクセスします。","#step-7",{"lastmod":2647},"2026-09-28",{"title":2649,"description":2611,"ogTitle":1717,"ogDescription":2611,"twitterTitle":1717,"twitterDescription":2611},"Cloudflare Zero TrustによるHermes Agentへの安全なアクセス","ja\u002Farticle\u002Fexposing-hermes-agent-to-private-network-using-cloudflare-warp",[1729,2652,1725,2653,2654],"Zero Trust","プライベートネットワーク","チュートリアル","i0kMFCbckmQif9X-O10srGArjMa6VemzcCDaqwHXHVY",{"id":2657,"title":2658,"author":425,"body":2659,"category":4071,"date":4073,"description":4074,"extension":1675,"image":4075,"imageAlt":4076,"isPublished":1070,"meta":4077,"minRead":1944,"navigation":1070,"path":203,"seo":4084,"stem":4086,"tags":4087,"updatedAt":1713,"__hash__":4091},"article\u002Fja\u002Farticle\u002Fsync-obsidian-across-devices.md","自ホスト型SynchとIgnisを導入しObsidian保管庫を複数デバイス間で安全に同期する方法",{"type":427,"value":2660,"toc":4049},[2661,2664,2669,2678,2687,2702,2707,2715,2719,2724,2738,2755,2758,2762,2765,2772,2777,2781,2785,2842,2849,2881,2885,2893,2899,2910,2972,2975,2992,2999,3011,3015,3019,3026,3031,3042,3059,3064,3077,3082,3088,3093,3108,3111,3116,3119,3124,3128,3133,3148,3152,3166,3175,3179,3184,3188,3198,3231,3235,3242,3383,3416,3421,3442,3448,3453,3456,3467,3538,3542,3547,3583,3714,3721,3727,3733,3739,3742,3748,3755,3769,3780,3787,3793,3800,3929,3935,3940,3943,3948,3951,3955,3961,3966,3972,3983,3992,3995,4006,4012,4018,4021,4023,4046],[430,2662,2663],{},"Obsidianは、ローカルファースト（ローカル優先）のナレッジ管理アプリです。すべてのノートはデバイス上のMarkdownファイルとして保存され、完全にユーザー自身の管理下に置かれます。しかし、ノートパソコン、スマートフォン、その他のデバイスで同じ保管庫（Vault）を共有したかったり、外出先からウェブブラウザ経由でアクセスしたかったりすることも少なくありません。",[433,2665],{"src":2666,"alt":2667,"style":2668},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-multi-device-sync-illustration.webp","複数デバイス間で同期されたObsidian保管庫のイラスト","max-width: 667px; width: 100%; height: auto;",[430,2670,2671,2672,2677],{},"Obsidian向けにはいくつかの同期ソリューションが提供されていますが、コンフリクト（衝突）の処理、暗号化、またはデータの所有権（データ主権）などの面で、何らかのトレードオフを伴うのが一般的です。",[441,2673,2676],{"href":2674,"rel":2675},"https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch",[445],"Synch","は、セルフホスト（自ホスト）サーバーを用いて、エンドツーエンド（端対端）の暗号化と自動コンフリクト処理を両立させながらObsidianの保管庫を同期できるオープンソースのアプリケーションです。",[430,2679,2680,2681,2686],{},"Obsidianのローカルファーストなアプローチはほとんどの場面で完璧に機能しますが、状況によってはウェブブラウザからリモートで保管庫にアクセスしたい場合もあります。",[441,2682,2685],{"href":2683,"rel":2684},"https:\u002F\u002Fgithub.com\u002FNystik-gh\u002Fignis",[445],"Ignis","は、オープンソースのウェブクライアントであり、ウェブブラウザ上でObsidianをデスクトップアプリに近い形式で実行できるため、場所を問わず保管庫の閲覧・編集が可能です。",[430,2688,2689,2690,2693,2694,1730,2696,2698,2699,2701],{},"このガイドでは、",[448,2691,2692],{},"VPS","（仮想専用サーバー）上に",[448,2695,2676],{},[448,2697,2685],{},"をセットアップし、これらを公開インターネットにさらすのではなく、**",[441,2700,1733],{"href":363},"**のプライベートネットワーク内で安全にホストする手順を紹介します。",[433,2703],{"src":2704,"alt":2705,"style":2706},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-sync-cloudflare-zero-trust-architecture.webp","Cloudflare Zero Trustを使用したObsidian同期のアーキテクチャ図","max-width: 671px; width: 100%; height: auto;",[461,2708],{"description":2709,"image":2710,"image-alt":2711,"label":2712,"min-read":2713,"title":2714,"to":363},"インバウンド用のファイアウォールポートを開放することなく、Cloudflare WARPとZero Trustを用いて、Hermesエージェントをグローバルから安全に公開・アクセスする方法を解説します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FExposing%20Hermes%20Agent%20to%20Private%20Network%20Using%20Cloudflare%20WARP\u002FEN-Exposing-Hermes-Agent-to-Private-Network-Using-Cloudflare-WARP.webp","Cloudflare Zero TrustとWARPトンネルを使用してHermesエージェントをプライベートネットワークに安全に公開する様子","関連記事","8","Cloudflare WARPでHermesエージェントをプライベートに公開する方法",[472,2716,2718],{"id":2717},"synchによるobsidian保管庫の安全な同期","SynchによるObsidian保管庫の安全な同期",[430,2720,2721,2723],{},[448,2722,2676],{},"には以下の特徴があります：",[481,2725,2726,2729,2732,2735],{},[484,2727,2728],{},"変更が検出されると、即座に保管庫を同期",[484,2730,2731],{},"アップロード前に保管庫のデータを暗号化",[484,2733,2734],{},"バージョン履歴（履歴管理）からの復元が可能",[484,2736,2737],{},"自動コンフリクト処理を搭載",[430,2739,2740,2742,2743,2754],{},[448,2741,2676],{},"は、デバイス上でランダムな32バイトの",[448,2744,2745,2746,2753],{},"保管庫キー（Vault Key）",[448,2747,2748,2749,2752],{},"を生成し、これを用いてデータを暗号化します。リモート保管庫を作成する際に、",[448,2750,2751],{},"保管庫パスワード","を設定します。このパスワードは","保管庫キー","を保護するために使用され、サーバー上に安全に保管され、他のデバイスでロックを解除する際に必要となります。",[430,2756,2757],{},"コンフリクトの解決は、サーバー上ではなく、お使いのクライアントデバイス上で行われる点に注意してください。2つのデバイスが同じノートを同時に編集した場合、サーバーは最初に到着したバージョンを保持し、もう一方のデバイスを「古い（バージョン不一致）」状態としてマークします。古い状態のデバイスは、最終的なマージ後のノートをアップロードする前に、ローカルの変更内容に新しいバージョンを自動的にマージ（統合）します。",[885,2759,2761],{"id":2760},"vpsへのsynchの導入","VPSへのSynchの導入",[2166,2763,2764],{"id":2764},"ドメイン名の作成",[430,2766,2767,2768,2771],{},"CloudflareでAレコードを作成し、プロキシステータスを ",[448,2769,2770],{},"「DNSのみ（DNS only）」","（CloudflareのCDNをバイパスする設定）に設定します。",[433,2773],{"src":2774,"alt":2775,"style":2776},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-synch-server.webp","CloudflareでのSynchサーバー用DNS Aレコードの構成","max-width: 538px; width: 100%; height: auto;",[2166,2778,2780],{"id":2779},"ubuntu上でdockerを用いたsynchのインストール","Ubuntu上でDockerを用いたSynchのインストール",[2782,2783,2784],"h5",{"id":2784},"リポジトリのクローン",[930,2786,2788],{"className":1038,"code":2787,"language":1040,"meta":425,"style":425},"git clone https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git       \n        \n# APIフォルダに移動\ncd synch\u002Fapps\u002Fapi\n        \n# 環境変数ファイルのサンプルをコピー\ncp .env.example .env\n",[491,2789,2790,2804,2809,2814,2822,2826,2831],{"__ignoreMap":425},[938,2791,2792,2795,2798,2801],{"class":940,"line":941},[938,2793,2794],{"class":1047},"git",[938,2796,2797],{"class":1051}," clone",[938,2799,2800],{"class":1051}," https:\u002F\u002Fgithub.com\u002Fhjinco\u002Fsynch.git",[938,2802,2803],{"class":948},"       \n",[938,2805,2806],{"class":940,"line":1067},[938,2807,2808],{"class":948},"        \n",[938,2810,2811],{"class":940,"line":1074},[938,2812,2813],{"class":1077},"# APIフォルダに移動\n",[938,2815,2816,2819],{"class":940,"line":1081},[938,2817,2818],{"class":970},"cd",[938,2820,2821],{"class":1051}," synch\u002Fapps\u002Fapi\n",[938,2823,2824],{"class":940,"line":1933},[938,2825,2808],{"class":948},[938,2827,2828],{"class":940,"line":1938},[938,2829,2830],{"class":1077},"# 環境変数ファイルのサンプルをコピー\n",[938,2832,2833,2836,2839],{"class":940,"line":1944},[938,2834,2835],{"class":1047},"cp",[938,2837,2838],{"class":1051}," .env.example",[938,2840,2841],{"class":1051}," .env\n",[2782,2843,2845,2848],{"id":2844},"env-ファイルの設定",[491,2846,2847],{},".env"," ファイルの設定",[481,2850,2851,2857,2875],{},[484,2852,2853,2856],{},[491,2854,2855],{},"PUBLIC_URL=synch.pafor.me",": Synchサーバーの公開ドメイン名（前のステップで作成したドメイン名）を入力します。",[484,2858,2859,1842,2862,2865,2866,2870,2871,2874],{},[491,2860,2861],{},"BETTER_AUTH_SECRET",[491,2863,2864],{},"SYNC_TOKEN_SECRET",": この",[441,2867,2869],{"href":2868},"\u002Fja\u002Ftools\u002Fsecret-key-hex","オンライン秘密鍵生成ツール","を使用するか、ターミナルで ",[491,2872,2873],{},"openssl rand -hex 32"," を2回実行して安全な鍵を生成します。",[484,2876,2877,2880],{},[491,2878,2879],{},"AUTH_ALLOWED_EMAILS",": アカウント作成とサインアップを許可するメールアドレスをカンマ区切りで指定します。",[2782,2882,2884],{"id":2883},"caddyfileへのドメインの追加","Caddyfileへのドメインの追加",[430,2886,2887,2888,2892],{},"Cloudflare DNSモジュールをCaddyに統合し、コンテナ内で起動する方法の詳細については、こちらの",[441,2889,2891],{"href":2890},"\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues#_4-enable-https-with-caddy","セルフホストBuzzに関する記事","をご参照ください。",[461,2894],{"description":2895,"image":2896,"image-alt":2897,"label":2898,"min-read":467,"title":453,"to":2890},"Dockerコンテナ内のCaddyが、Cloudflare DNS認証チャレンジを用いてSSL\u002FTLS証明書を自動的に発行・更新するように構成する方法を学びます。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002FEN-Self-Hosting-Buzz-As-The-Workspace-Where-AI-Agents-Become-Colleagues.webp","自己ホスト型ワークスペースにおいて、SSL\u002FTLS証明書の自動生成のためにCloudflare DNS APIトークンを使用してCaddyを構成する構成図","セルフホストガイド",[430,2900,2901,2902,2905,2906,2909],{},"Caddyfileに ",[491,2903,2904],{},"SYNCH_DOMAIN"," ディレクティブを追加し、ポート ",[491,2907,2908],{},"8787","（Synchコンテナが使用するポート）を指定します：",[930,2911,2915],{"className":2912,"code":2913,"language":2914,"meta":425,"style":425},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n\n{$SYNCH_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:8787\n}\n","json",[491,2916,2917,2922,2930,2934,2938,2952,2957,2968],{"__ignoreMap":425},[938,2918,2919],{"class":940,"line":941},[938,2920,2921],{"class":952},"{\n",[938,2923,2924,2927],{"class":940,"line":1067},[938,2925,2926],{"class":948},"  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN",[938,2928,2929],{"class":952},"}\n",[938,2931,2932],{"class":940,"line":1074},[938,2933,2929],{"class":948},[938,2935,2936],{"class":940,"line":1081},[938,2937,1071],{"emptyLinePlaceholder":1070},[938,2939,2940,2943,2946,2949],{"class":940,"line":1933},[938,2941,2942],{"class":952},"{",[938,2944,2945],{"class":948},"$SYNCH_DOMAIN",[938,2947,2948],{"class":952},"}",[938,2950,2951],{"class":952}," {\n",[938,2953,2954],{"class":940,"line":1938},[938,2955,2956],{"class":948},"  encode zstd gzip\n",[938,2958,2959,2962,2964],{"class":940,"line":1944},[938,2960,2961],{"class":948},"  reverse_proxy host.docker.internal",[938,2963,1366],{"class":952},[938,2965,2967],{"class":2966},"sbssI","8787\n",[938,2969,2970],{"class":940,"line":2277},[938,2971,2929],{"class":952},[430,2973,2974],{},"コンテナを起動します：",[930,2976,2978],{"className":1038,"code":2977,"language":1040,"meta":425,"style":425},"docker compose up -d\n",[491,2979,2980],{"__ignoreMap":425},[938,2981,2982,2984,2986,2989],{"class":940,"line":941},[938,2983,1181],{"class":1047},[938,2985,1184],{"class":1051},[938,2987,2988],{"class":1051}," up",[938,2990,2991],{"class":1051}," -d\n",[430,2993,2994,2995,2998],{},"次の ",[491,2996,2997],{},"curl"," コマンドを実行して、稼働状況を確認します：",[930,3000,3002],{"className":1038,"code":3001,"language":1040,"meta":425,"style":425},"curl https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[491,3003,3004],{"__ignoreMap":425},[938,3005,3006,3008],{"class":940,"line":941},[938,3007,2997],{"class":1047},[938,3009,3010],{"class":1051}," https:\u002F\u002Fsynch.pafor.me\u002Fhealth\n",[885,3012,3014],{"id":3013},"obsidianとsynchサーバーの接続","ObsidianとSynchサーバーの接続",[2166,3016,3018],{"id":3017},"obsidianへのsynchプラグインのインストール","ObsidianへのSynchプラグインのインストール",[430,3020,3021,3022,3025],{},"Obsidianの設定を開き、**「コミュニティプラグイン」",[448,3023,3024],{},"に移動して、","「閲覧（Browse）」**ボタンをクリックします：",[433,3027],{"src":3028,"alt":3029,"style":3030},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-community-plugins-browse.webp","Obsidian設定でのコミュニティプラグインの閲覧","max-width: 523px; width: 100%; height: auto;",[430,3032,3033,3034,3037,3038],{},"検索バーで ",[448,3035,3036],{},"「Synchrun」"," を探し、インストールします：\n",[433,3039],{"src":3040,"alt":3041,"style":2776},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-install-synchrun-plugin.webp","ObsidianへのSynchrunプラグインのインストール",[430,3043,3044,3046,3047,3050,3051,3058],{},[448,3045,3036],{}," のインストール完了後、プラグインの設定を開き、**「Use a self-hosted server（自ホストサーバーを使用）」",[448,3048,3049],{},"を有効にします。次に、","「Server URL」",[448,3052,3053,3054,3057],{},"フィールドに ",[491,3055,3056],{},"https:\u002F\u002Fsynch.pafor.me"," を入力し、","「Save」**をクリックします。",[433,3060],{"src":3061,"alt":3062,"style":3063},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-plugin-settings-self-hosted.webp","Synchrunプラグイン設定でのセルフホストサーバーURLの構成","max-width: 525px; width: 100%; height: auto;",[430,3065,3066,3067,3070,3071,3073,3074,3076],{},"**「Account」**項目内にある ",[448,3068,3069],{},"「Sign in on this device（このデバイスでサインイン）」"," ボタンをクリックします。続いて、",[491,3072,2847],{}," ファイルの ",[491,3075,2879],{}," リストに指定したメールアドレスを使ってサインアップ（アカウント登録）を行います。完了後、以下の認証ページにリダイレクトされます：",[433,3078],{"src":3079,"alt":3080,"style":3081},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-account-authorization-page.webp","Synchrunのアカウント認証ページ","max-width: 494px; width: 100%; height: auto;",[430,3083,3084,3087],{},[448,3085,3086],{},"「Allow Obsidian sign-in（Obsidianへのサインインを許可）」"," ボタンをクリックします：",[433,3089],{"src":3090,"alt":3091,"style":3092},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-allow-obsidian-signin.webp","SynchのためのObsidianサインインの許可","max-width: 498px; width: 100%; height: auto;",[430,3094,3095,3098,3099,3102,3103],{},[448,3096,3097],{},"「Return to Obsidian（Obsidianに戻る）」"," ボタンをクリックし、次に ",[448,3100,3101],{},"「Create vault（保管庫の作成）」"," をクリックします：\n",[433,3104],{"src":3105,"alt":3106,"style":3107},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-create-remote-vault.webp","Synchrunでの新しいリモート保管庫の作成","max-width: 496px; width: 100%; height: auto;",[430,3109,3110],{},"リモート保管庫の名前と安全なパスワードを入力して作成します。",[433,3112],{"src":3113,"alt":3114,"style":3115},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-vault-password-setup.webp","Obsidianリモート保管庫の安全なパスワードの設定","max-width: 500px; width: 100%; height: auto;",[430,3117,3118],{},"これで自動的に同期処理が開始されます。お使いの保管庫の容量によって完了までにかかる時間は異なります。同期完了後、ストレージの総使用量が表示されます。",[433,3120],{"src":3121,"alt":3122,"style":3123},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-synchrun-sync-completed-storage.webp","使用中の合計ストレージを示すSynchrun同期完了画面","max-width: 508px; width: 100%; height: auto;",[472,3125,3127],{"id":3126},"ignisによるブラウザベースのobsidianアクセス","IgnisによるブラウザベースのObsidianアクセス",[430,3129,3130,3132],{},[448,3131,2685],{},"は、Obsidianが使用するElectron APIをWeb APIに置き換えることで、標準的なウェブブラウザ上で直接ObsidianのJavaScriptコードを実行可能にするツールです。すべてのMarkdownファイルと添付ファイルは、ホストサーバー上のファイルシステムに直接保存されます。",[430,3134,3135,3136,3141,3142,3147],{},"ただし、スタンドアロン型のObsidianデスクトップアプリと比較して、いくつかの制限事項が存在します。ブラウザ環境に直接対応する機能がないElectron APIやNode.js APIに依存する一部の機能やサードパーティ製プラグインは動作しません。詳細な互換性については、Ignis公式の ",[441,3137,3140],{"href":3138,"rel":3139},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Flimitations\u002F",[445],"Limitations（制限事項）"," および ",[441,3143,3146],{"href":3144,"rel":3145},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fusing\u002Fplugin-compatibility\u002F",[445],"Plugin compatibility（プラグイン互換性）"," ガイドをご参照ください。",[885,3149,3151],{"id":3150},"ignisのセットアップ","Ignisのセットアップ",[430,3153,3154,3155,3157,3158,3161,3162,3165],{},"今回はDockerを使用し、VPS上に ",[448,3156,2685],{}," をインストールして、ローカルの ",[491,3159,3160],{},".\u002Fvaults"," フォルダにマウントします。この保管庫ディレクトリは、先ほど設定したリモート保管庫から最新のノートデータを取得するために、",[448,3163,3164],{},"Synch CLI","を用いてバックグラウンドで自動同期されます。",[430,3167,3168,3169,3171,3172,3174],{},"また、",[448,3170,2685],{},"には標準でユーザー認証機能が備わっていないため、外部からの不正アクセスを防ぐために、**",[441,3173,1733],{"href":363},"**のプライベートネットワークの背後に隠して安全を確保します。",[2166,3176,3178],{"id":3177},"dnsレコードの作成","DNSレコードの作成",[433,3180],{"src":3181,"alt":3182,"style":3183},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fcloudflare-dns-a-record-ignis.webp","CloudflareでのIgnis Webクライアント用DNS Aレコードの構成","max-width: 552px; width: 100%; height: auto;",[2166,3185,3187],{"id":3186},"caddyfileへのドメイン追加","Caddyfileへのドメイン追加",[430,3189,3190,3193,3194,3197],{},[491,3191,3192],{},"synch.pafor.me"," と同様に、Caddyfileに ",[491,3195,3196],{},"obsidian.pafor.me"," を追加します：",[930,3199,3201],{"className":2912,"code":3200,"language":2914,"meta":425,"style":425},"{$OBSIDIAN_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:9898\n}\n",[491,3202,3203,3214,3218,3227],{"__ignoreMap":425},[938,3204,3205,3207,3210,3212],{"class":940,"line":941},[938,3206,2942],{"class":952},[938,3208,3209],{"class":948},"$OBSIDIAN_DOMAIN",[938,3211,2948],{"class":952},[938,3213,2951],{"class":952},[938,3215,3216],{"class":940,"line":1067},[938,3217,2956],{"class":948},[938,3219,3220,3222,3224],{"class":940,"line":1074},[938,3221,2961],{"class":948},[938,3223,1366],{"class":952},[938,3225,3226],{"class":2966},"9898\n",[938,3228,3229],{"class":940,"line":1081},[938,3230,2929],{"class":952},[2166,3232,3234],{"id":3233},"dockerを使用したignisの起動","Dockerを使用したIgnisの起動",[430,3236,3237,3238,3241],{},"以下の docker-compose yml の内容を ",[491,3239,3240],{},"ignis-docker-compose.yml"," としてVPS上に保存します：",[930,3243,3245],{"className":1350,"code":3244,"language":1352,"meta":425,"style":425},"services:\n  ignis:\n    image: nobbe\u002Fignis:latest\n    ports:\n      - \"9898:8080\"\n    environment:\n      # お使いのホストユーザーのUID\u002FGIDに合わせて構成してください (確認コマンド: id)\n      - PUID=1000\n      - PGID=1000\n      - WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n    volumes:\n      - .\u002Fvaults:\u002Fvaults\n      - .\u002Fdata:\u002Fapp\u002Fdata\n      - obsidian-app:\u002Fapp\u002Fobsidian-app\n    restart: unless-stopped\n\nvolumes:\n  obsidian-app:\n",[491,3246,3247,3254,3261,3271,3278,3291,3298,3303,3310,3317,3324,3331,3338,3345,3352,3362,3367,3375],{"__ignoreMap":425},[938,3248,3249,3252],{"class":940,"line":941},[938,3250,3251],{"class":1362},"services",[938,3253,1377],{"class":952},[938,3255,3256,3259],{"class":940,"line":1067},[938,3257,3258],{"class":1362},"  ignis",[938,3260,1377],{"class":952},[938,3262,3263,3266,3268],{"class":940,"line":1074},[938,3264,3265],{"class":1362},"    image",[938,3267,1366],{"class":952},[938,3269,3270],{"class":1051}," nobbe\u002Fignis:latest\n",[938,3272,3273,3276],{"class":940,"line":1081},[938,3274,3275],{"class":1362},"    ports",[938,3277,1377],{"class":952},[938,3279,3280,3283,3286,3289],{"class":940,"line":1933},[938,3281,3282],{"class":952},"      -",[938,3284,3285],{"class":952}," \"",[938,3287,3288],{"class":1051},"9898:8080",[938,3290,1965],{"class":952},[938,3292,3293,3296],{"class":940,"line":1938},[938,3294,3295],{"class":1362},"    environment",[938,3297,1377],{"class":952},[938,3299,3300],{"class":940,"line":1944},[938,3301,3302],{"class":1077},"      # お使いのホストユーザーのUID\u002FGIDに合わせて構成してください (確認コマンド: id)\n",[938,3304,3305,3307],{"class":940,"line":2277},[938,3306,3282],{"class":952},[938,3308,3309],{"class":1051}," PUID=1000\n",[938,3311,3312,3314],{"class":940,"line":2288},[938,3313,3282],{"class":952},[938,3315,3316],{"class":1051}," PGID=1000\n",[938,3318,3319,3321],{"class":940,"line":2384},[938,3320,3282],{"class":952},[938,3322,3323],{"class":1051}," WS_ORIGINS=https:\u002F\u002Fobsidian.pafor.me\n",[938,3325,3326,3329],{"class":940,"line":2390},[938,3327,3328],{"class":1362},"    volumes",[938,3330,1377],{"class":952},[938,3332,3333,3335],{"class":940,"line":2396},[938,3334,3282],{"class":952},[938,3336,3337],{"class":1051}," .\u002Fvaults:\u002Fvaults\n",[938,3339,3340,3342],{"class":940,"line":2401},[938,3341,3282],{"class":952},[938,3343,3344],{"class":1051}," .\u002Fdata:\u002Fapp\u002Fdata\n",[938,3346,3347,3349],{"class":940,"line":2407},[938,3348,3282],{"class":952},[938,3350,3351],{"class":1051}," obsidian-app:\u002Fapp\u002Fobsidian-app\n",[938,3353,3354,3357,3359],{"class":940,"line":1706},[938,3355,3356],{"class":1362},"    restart",[938,3358,1366],{"class":952},[938,3360,3361],{"class":1051}," unless-stopped\n",[938,3363,3365],{"class":940,"line":3364},16,[938,3366,1071],{"emptyLinePlaceholder":1070},[938,3368,3370,3373],{"class":940,"line":3369},17,[938,3371,3372],{"class":1362},"volumes",[938,3374,1377],{"class":952},[938,3376,3378,3381],{"class":940,"line":3377},18,[938,3379,3380],{"class":1362},"  obsidian-app",[938,3382,1377],{"class":952},[481,3384,3385,3396,3410],{},[484,3386,3387,3388,3391,3392,3395],{},"ポート ",[491,3389,3390],{},"8080"," は他のサービスと競合しやすいため、ホスト側では ",[491,3393,3394],{},"9898"," を使用します。",[484,3397,3398,3399,3402,3403,1842,3406,3409],{},"VPS上で ",[491,3400,3401],{},"id"," コマンドを実行し、お使いのホストユーザーの ",[491,3404,3405],{},"UID",[491,3407,3408],{},"GID"," を確認・設定して、適切なファイルシステム権限が適用されるようにします。",[484,3411,3412,3415],{},[491,3413,3414],{},"WS_ORIGINS"," を設定し、指定した独自ドメインのみからWebSocket接続を受け入れるよう制限します。",[430,3417,3418,3420],{},[448,3419,2685],{}," のコンテナを起動します：",[930,3422,3424],{"className":1038,"code":3423,"language":1040,"meta":425,"style":425},"docker compose -f ignis-docker-compose.yml up -d\n",[491,3425,3426],{"__ignoreMap":425},[938,3427,3428,3430,3432,3435,3438,3440],{"class":940,"line":941},[938,3429,1181],{"class":1047},[938,3431,1184],{"class":1051},[938,3433,3434],{"class":1051}," -f",[938,3436,3437],{"class":1051}," ignis-docker-compose.yml",[938,3439,2988],{"class":1051},[938,3441,2991],{"class":1051},[430,3443,3444,3445,3447],{},"ウェブブラウザで設定したドメインにアクセスすると、**「Vault Manager（保管庫マネージャー）」**が表示されます。まだ保管庫が作成されていないため、画面は空の状態です。次のセクションで、リモート保管庫とデータを同期するために ",[448,3446,3164],{}," の設定を行います。",[433,3449],{"src":3450,"alt":3451,"style":3452},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-vault-manager-empty.webp","Ignis Webクライアントの空のVault Managerインターフェース","max-width: 466px; width: 100%; height: auto;",[2166,3454,3455],{"id":3455},"ファイアウォールに関する注意点",[430,3457,3458,3459,3462,3463,3466],{},"Dockerの標準仕様として、コンテナを起動すると自動的にDNATおよびFORWARDルールがiptablesへ挿入され、外部からの通信がダイレクトに対象コンテナへルーティングされます。この挙動は、Ubuntuに標準搭載されているUFWやiptablesの ",[491,3460,3461],{},"INPUT"," チェーンによる制御をバイパスしてしまいます。コンテナを完全にプライベート化し、不要な通信を遮断するために、手動で以下のルールを ",[491,3464,3465],{},"iptables"," に適用します：",[930,3468,3470],{"className":1038,"code":3469,"language":1040,"meta":425,"style":425},"# 外部公開インターフェースからのトラフィックをすべて拒否\nsudo iptables -I DOCKER-USER -i ext_if -j DROP \n\n# 許可する特定のCloudflare WARPクライアントのプライベートIPからのみアクセスを許可\nsudo iptables -I DOCKER-USER -i ext_if -s 100.96.0.10 -j ACCEPT\n",[491,3471,3472,3477,3504,3508,3513],{"__ignoreMap":425},[938,3473,3474],{"class":940,"line":941},[938,3475,3476],{"class":1077},"# 外部公開インターフェースからのトラフィックをすべて拒否\n",[938,3478,3479,3481,3484,3487,3490,3493,3496,3499,3502],{"class":940,"line":1067},[938,3480,1901],{"class":1047},[938,3482,3483],{"class":1051}," iptables",[938,3485,3486],{"class":1051}," -I",[938,3488,3489],{"class":1051}," DOCKER-USER",[938,3491,3492],{"class":1051}," -i",[938,3494,3495],{"class":1051}," ext_if",[938,3497,3498],{"class":1051}," -j",[938,3500,3501],{"class":1051}," DROP",[938,3503,2033],{"class":948},[938,3505,3506],{"class":940,"line":1074},[938,3507,1071],{"emptyLinePlaceholder":1070},[938,3509,3510],{"class":940,"line":1081},[938,3511,3512],{"class":1077},"# 許可する特定のCloudflare WARPクライアントのプライベートIPからのみアクセスを許可\n",[938,3514,3515,3517,3519,3521,3523,3525,3527,3530,3533,3535],{"class":940,"line":1933},[938,3516,1901],{"class":1047},[938,3518,3483],{"class":1051},[938,3520,3486],{"class":1051},[938,3522,3489],{"class":1051},[938,3524,3492],{"class":1051},[938,3526,3495],{"class":1051},[938,3528,3529],{"class":1051}," -s",[938,3531,3532],{"class":2966}," 100.96.0.10",[938,3534,3498],{"class":1051},[938,3536,3537],{"class":1051}," ACCEPT\n",[2166,3539,3541],{"id":3540},"synch-cliのセットアップ","Synch CLIのセットアップ",[430,3543,3544,3546],{},[448,3545,3164],{},"は、グラフィカルなUIを持たない（CUI用の）ツールであり、デスクトップ版のアプリケーション一式をインストールすることなく、リモートサーバー上で直接Obsidianの保管庫フォルダを同期させることができます。",[430,3548,3549,3550,3553,3554,3556,3557,3560,3561,3564,3565,750,3568,750,3571,3574,3575,3578,3579,3582],{},"先ほどクローンした ",[491,3551,3552],{},"synch"," リポジトリから、",[448,3555,3164],{},"をビルドします。ビルドには、",[448,3558,3559],{},"Node.js >= 22.5","（CLIが内部で ",[491,3562,3563],{},"node:sqlite"," や、",[491,3566,3567],{},"fetch",[491,3569,3570],{},"WebSocket",[491,3572,3573],{},"WebCrypto"," などのブラウザ互換APIに依存しているため）および ",[448,3576,3577],{},"pnpm","（リポジトリがバージョン ",[491,3580,3581],{},"10.33.0"," のpnpmワークスペースとして管理されているため）が必要です：",[930,3584,3586],{"className":1038,"code":3585,"language":1040,"meta":425,"style":425},"# バージョンの確認\nnode --version   # 22.5以上であることを確認\npnpm --version\n\n# リポジトリのルートディレクトリで\npnpm install\n\n# CLIのビルドを実行\npnpm -C apps\u002Fcli build\n\n# ビルドに成功すると、`apps\u002Fcli\u002Fdist\u002Fsynch.js` が生成されます。実行権限を付与し、パスの通った場所に配置します\nchmod +x apps\u002Fcli\u002Fdist\u002Fsynch.js\nln -sf \"$PWD\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js\" \"$HOME\u002F.local\u002Fbin\u002Fsynch\"\n\n# 正しく導入されたか確認\nsynch --help\n",[491,3587,3588,3593,3604,3611,3615,3620,3627,3631,3636,3649,3653,3658,3669,3698,3702,3707],{"__ignoreMap":425},[938,3589,3590],{"class":940,"line":941},[938,3591,3592],{"class":1077},"# バージョンの確認\n",[938,3594,3595,3598,3601],{"class":940,"line":1067},[938,3596,3597],{"class":1047},"node",[938,3599,3600],{"class":1051}," --version",[938,3602,3603],{"class":1077},"   # 22.5以上であることを確認\n",[938,3605,3606,3608],{"class":940,"line":1074},[938,3607,3577],{"class":1047},[938,3609,3610],{"class":1051}," --version\n",[938,3612,3613],{"class":940,"line":1081},[938,3614,1071],{"emptyLinePlaceholder":1070},[938,3616,3617],{"class":940,"line":1933},[938,3618,3619],{"class":1077},"# リポジトリのルートディレクトリで\n",[938,3621,3622,3624],{"class":940,"line":1938},[938,3623,3577],{"class":1047},[938,3625,3626],{"class":1051}," install\n",[938,3628,3629],{"class":940,"line":1944},[938,3630,1071],{"emptyLinePlaceholder":1070},[938,3632,3633],{"class":940,"line":2277},[938,3634,3635],{"class":1077},"# CLIのビルドを実行\n",[938,3637,3638,3640,3643,3646],{"class":940,"line":2288},[938,3639,3577],{"class":1047},[938,3641,3642],{"class":1051}," -C",[938,3644,3645],{"class":1051}," apps\u002Fcli",[938,3647,3648],{"class":1051}," build\n",[938,3650,3651],{"class":940,"line":2384},[938,3652,1071],{"emptyLinePlaceholder":1070},[938,3654,3655],{"class":940,"line":2390},[938,3656,3657],{"class":1077},"# ビルドに成功すると、`apps\u002Fcli\u002Fdist\u002Fsynch.js` が生成されます。実行権限を付与し、パスの通った場所に配置します\n",[938,3659,3660,3663,3666],{"class":940,"line":2396},[938,3661,3662],{"class":1047},"chmod",[938,3664,3665],{"class":1051}," +x",[938,3667,3668],{"class":1051}," apps\u002Fcli\u002Fdist\u002Fsynch.js\n",[938,3670,3671,3674,3677,3679,3682,3685,3688,3690,3693,3696],{"class":940,"line":2401},[938,3672,3673],{"class":1047},"ln",[938,3675,3676],{"class":1051}," -sf",[938,3678,3285],{"class":952},[938,3680,3681],{"class":948},"$PWD",[938,3683,3684],{"class":1051},"\u002Fapps\u002Fcli\u002Fdist\u002Fsynch.js",[938,3686,3687],{"class":952},"\"",[938,3689,3285],{"class":952},[938,3691,3692],{"class":948},"$HOME",[938,3694,3695],{"class":1051},"\u002F.local\u002Fbin\u002Fsynch",[938,3697,1965],{"class":952},[938,3699,3700],{"class":940,"line":2407},[938,3701,1071],{"emptyLinePlaceholder":1070},[938,3703,3704],{"class":940,"line":1706},[938,3705,3706],{"class":1077},"# 正しく導入されたか確認\n",[938,3708,3709,3711],{"class":940,"line":3364},[938,3710,3552],{"class":1047},[938,3712,3713],{"class":1051}," --help\n",[430,3715,3716,3717,3720],{},"ビルドしたSynch CLIは、リモートのSynch保管庫が稼働しているのと同じVPS上で実行するため、ローカルのAPIサーバーに直接接続できます。もし別の独立したサーバーから同期を設定する場合は、",[491,3718,3719],{},"synch login --api-url \u003CリモートのSynchのAPIのURL>"," を実行してあらかじめ接続先を定義しておきます。",[430,3722,3723],{},[433,3724],{"alt":3725,"src":3726},"ターミナルでカスタムAPI URLを使用してsynch loginを実行する","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-api-url-terminal.webp",[430,3728,1849,3729,3732],{},[491,3730,3731],{},"synch login"," を実行すると、認証用URLが提示されます：",[430,3734,3735],{},[433,3736],{"alt":3737,"src":3738},"Synch CLIの認証URLを示すターミナル出力","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-login-auth-url-terminal.webp",[430,3740,3741],{},"デスクトップ版ObsidianのSynchrunプラグインに登録したのと同じメールアドレスを用いて、提示されたウェブページからログインします。",[430,3743,3744],{},[433,3745],{"alt":3746,"src":3747},"Synch CLI認証のためのWebログインの成功","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-web-login-success.webp",[430,3749,3750,3751,3754],{},"ログイン後、",[491,3752,3753],{},"synch vault connect --vault ~\u002Fvaults\u002F\u003C保管庫名> --vault-id asadqe-7b29-4677-fsad-234asdafasd"," を実行して、VPS上のローカルディレクトリとリモートの保管庫を紐づけます。",[430,3756,3757,3758,3760,3761,3764,3765,3768],{},"リモート保管庫のID（Vault ID）は、デスクトップ版プラグインの ",[448,3759,3036],{}," 設定画面の ",[448,3762,3763],{},"「Manage remote vaults（リモート保管庫の管理）」"," から確認可能です。クリックするとウェブページが開き、固有のGUID（例: ",[491,3766,3767],{},"123e4567-e89b-12d3-a456-426614174000","）が設定された保管庫一覧が表示されます：",[430,3770,3771,3776],{},[433,3772],{"src":3773,"alt":3774,"style":3775},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-manage-remote-vaults.webp","Synchrunプラグインでのリモート保管庫の管理","max-width: 582px; width: 100%; height: auto;",[433,3777],{"alt":3778,"src":3779},"Synchrunでの一意のリモート保管庫IDの検索","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynchrun-remote-vault-id.webp",[430,3781,3782,3783,3786],{},"プロンプトの指示に従って保管庫のパスワードを入力すると、接続が確立されます。その後、",[491,3784,3785],{},"synch sync --vault ~\u002Fvaults\u002F\u003C保管庫名>"," を実行して最初の同期処理（イニシャル同期）を行います。初回はデータ量に応じて数分〜数十分ほどかかる場合があります。",[430,3788,3789],{},[433,3790],{"alt":3791,"src":3792},"Synch CLIでの初期保管庫同期の進行状況","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fsynch-cli-initial-sync-progress.webp",[430,3794,3795,3796,3799],{},"この同期処理を常時自動化するために、システム起動時にバックグラウンドで ",[491,3797,3798],{},"synch watch"," が自動実行され、変更を即座に反映できるように、systemdのサービスユニットを作成して有効化します：",[930,3801,3803],{"className":1038,"code":3802,"language":1040,"meta":425,"style":425},"sudo tee \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service \u003C\u003C'EOF'\n[Unit]\nDescription=Synch vault watcher\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=simple\nUser=\u003Cusername>\nExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\nWorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\nEnvironment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\nEnvironment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\nRestart=always\nRestartSec=5\n\n[Install]\nWantedBy=multi-user.target\nEOF\nsudo systemctl daemon-reload\nsudo systemctl enable --now synch-watch.service\n",[491,3804,3805,3821,3825,3830,3835,3840,3844,3848,3853,3858,3863,3868,3873,3878,3882,3887,3891,3895,3899,3905,3914],{"__ignoreMap":425},[938,3806,3807,3809,3812,3815,3818],{"class":940,"line":941},[938,3808,1901],{"class":1047},[938,3810,3811],{"class":1051}," tee",[938,3813,3814],{"class":1051}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fsynch-watch.service",[938,3816,3817],{"class":952}," \u003C\u003C",[938,3819,3820],{"class":952},"'EOF'\n",[938,3822,3823],{"class":940,"line":1067},[938,3824,2342],{"class":1051},[938,3826,3827],{"class":940,"line":1074},[938,3828,3829],{"class":1051},"Description=Synch vault watcher\n",[938,3831,3832],{"class":940,"line":1081},[938,3833,3834],{"class":1051},"After=network-online.target\n",[938,3836,3837],{"class":940,"line":1933},[938,3838,3839],{"class":1051},"Wants=network-online.target\n",[938,3841,3842],{"class":940,"line":1938},[938,3843,1071],{"emptyLinePlaceholder":1070},[938,3845,3846],{"class":940,"line":1944},[938,3847,2361],{"class":1051},[938,3849,3850],{"class":940,"line":2277},[938,3851,3852],{"class":1051},"Type=simple\n",[938,3854,3855],{"class":940,"line":2288},[938,3856,3857],{"class":1051},"User=\u003Cusername>\n",[938,3859,3860],{"class":940,"line":2384},[938,3861,3862],{"class":1051},"ExecStart=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin\u002Fsynch watch --vault \u002Fhome\u002F\u003Cusername>\u002Fvaults\u002F\u003Cvault-name>\n",[938,3864,3865],{"class":940,"line":2390},[938,3866,3867],{"class":1051},"WorkingDirectory=\u002Fhome\u002F\u003Cusername>\u002Fvaults\n",[938,3869,3870],{"class":940,"line":2396},[938,3871,3872],{"class":1051},"Environment=\"PATH=\u002Fhome\u002F\u003Cusername>\u002F.local\u002Fbin:\u002Fhome\u002F\u003Cusername>\u002F.cargo\u002Fbin:\u002Fusr\u002Flocal\u002Fsbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fsbin:\u002Fusr\u002Fbin:\u002Fsbin:\u002Fbin\"\n",[938,3874,3875],{"class":940,"line":2401},[938,3876,3877],{"class":1051},"Environment=\"HOME=\u002Fhome\u002F\u003Cusername>\"\n",[938,3879,3880],{"class":940,"line":2407},[938,3881,2381],{"class":1051},[938,3883,3884],{"class":940,"line":1706},[938,3885,3886],{"class":1051},"RestartSec=5\n",[938,3888,3889],{"class":940,"line":3364},[938,3890,1071],{"emptyLinePlaceholder":1070},[938,3892,3893],{"class":940,"line":3369},[938,3894,2404],{"class":1051},[938,3896,3897],{"class":940,"line":3377},[938,3898,2410],{"class":1051},[938,3900,3902],{"class":940,"line":3901},19,[938,3903,3904],{"class":952},"EOF\n",[938,3906,3908,3910,3912],{"class":940,"line":3907},20,[938,3909,1901],{"class":1047},[938,3911,1904],{"class":1051},[938,3913,2429],{"class":1051},[938,3915,3917,3919,3921,3923,3926],{"class":940,"line":3916},21,[938,3918,1901],{"class":1047},[938,3920,1904],{"class":1051},[938,3922,2030],{"class":1051},[938,3924,3925],{"class":1051}," --now",[938,3927,3928],{"class":1051}," synch-watch.service\n",[430,3930,3931,3932,3934],{},"ブラウザで ",[491,3933,3196],{}," にアクセスしてみましょう。以下のように、デスクトップ版とほとんど見分けがつかない美しいインターフェースとノートレイアウトが表示されます：",[433,3936],{"src":3937,"alt":3938,"style":3939},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-web-interface-desktop-view.webp","デスクトップでObsidian保管庫を表示するIgnis Webインターフェース","max-width: 593px; width: 100%; height: auto;",[430,3941,3942],{},"設定アイコンを開くと、ほぼすべての基本設定がそのまま引き継がれていることが確認できます。ただし、コミュニティプラグインについては、ブラウザ側で必要に応じて個別に再インストールを行う必要があります：",[433,3944],{"src":3945,"alt":3946,"style":3947},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-settings-community-plugins.webp","Ignis Webインターフェースのコミュニティプラグイン設定","max-width: 597px; width: 100%; height: auto;",[430,3949,3950],{},"動作テストとして、このウェブ画面側から新しくノートを1枚追加してみます：",[433,3952],{"src":3953,"alt":3954,"style":3947},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-create-new-note-web.webp","Ignis Webインターフェースを介した新しいMarkdownメモの作成",[430,3956,3957,3958,3960],{},"作成すると、即座にデスクトップ側のObsidianアプリにも同期され反映されることが確認できます。なお、中身が空のフォルダは ",[448,3959,2685],{}," の画面上には表示されない仕様になっています。",[433,3962],{"src":3963,"alt":3964,"style":3965},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fobsidian-desktop-synced-note.webp","新しく作成されたメモがObsidianデスクトップアプリに正常に同期されました","max-width: 502px; width: 100%; height: auto;",[430,3967,3968,3969,3971],{},"スマートフォンなどのモバイルブラウザから ",[491,3970,3196],{}," にアクセスした場合の表示：",[430,3973,3974,3979],{},[433,3975],{"src":3976,"alt":3977,"style":3978},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-sidebar.webp","モバイルデバイスでのIgnis Webクライアントのサイドバーナビゲーション","max-width: 269px; width: 100%; height: auto;",[433,3980],{"src":3981,"alt":3982,"style":3978},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002Fignis-mobile-view-editor.webp","モバイルデバイスでのIgnis WebクライアントのMarkdownメモエディター",[430,3984,3168,3985,3987,3988,3991],{},[448,3986,2685],{},"上で不要になったノートを削除した場合、そのノートはローカル保管庫内の ",[491,3989,3990],{},"~\u002Fvaults\u002F\u003C保管庫名>\u002F.trash"," フォルダへ安全に移動（ゴミ箱行き）となります。",[472,3993,3994],{"id":3994},"自己ホスト型保管庫に関するまとめ",[430,3996,3997,3998,1842,4000,4002,4003,4005],{},"オープンソースの ",[448,3999,2676],{},[448,4001,2685],{}," を組み合わせることで、自分が完全に管理・所有するインフラ上で、メインのObsidian保管庫をデバイスを選ばず安全に同期・活用できるようになります。また、これらのサービスを ",[448,4004,1733],{}," の閉域プライベートネットワーク内に配置することで、あなたの大切な個人ノートを公開インターネットの脅威から完全に隔離・保護することが可能です。",[430,4007,4008,4009,4011],{},"なお、",[448,4010,2685],{},"はデスクトップ版のローカルアプリを100%代替することを狙って作られたものではありません。あくまで「手元に普段のパソコンがない時や、他環境のブラウザからノートを一時的に確認・編集したい場合」に重宝する、軽量かつ機動性に優れたウェブクライアントとしての役割を担います。普段のノート記述や細かなカスタマイズ、プラグインの本格的な利用には、引き続きObsidianのネイティブアプリを主軸として活用するのが最善です。",[430,4013,4014,4015,4017],{},"最後に、Synchはエンドツーエンドで強力に暗号化されているため、ブルートフォース（総当たり）攻撃からノートを守るためには、十分に強固なリモート保管庫パスワードの設定が必須です。万が一パスワードを紛失した場合、サーバー側には復号された ",[448,4016,2753],{}," は一切保存されていないため、データを復元することは絶対に不可能です。VPSのインスタンスのセキュリティ管理、および自動スナップショットやバックアップのメンテナンスも、怠らず適切に行ってください。",[430,4019,4020],{},"Synchの履歴管理機能やゴミ箱への退避機能によって、誤操作によるデータ消失の大半は防げますが、大切なナレッジを守るためにも、Obsidian保管庫全体の独立したバックアップを別途定期的に取得しておくことを強くお勧めします。",[472,4022,1621],{"id":1621},[481,4024,4025,4032,4039],{},[484,4026,4027],{},[441,4028,4031],{"href":4029,"rel":4030},"https:\u002F\u002Fsynch.run\u002Fself-hosting-docker\u002F",[445],"Docker Composeを用いたSynchのデプロイ方法",[484,4033,4034],{},[441,4035,4038],{"href":4036,"rel":4037},"https:\u002F\u002Fignis.thiefling.com\u002Fdocs\u002Fserver\u002Fdeploy\u002F",[445],"Dockerを用いたIgnisのデプロイ方法",[484,4040,4041],{},[441,4042,4045],{"href":4043,"rel":4044},"https:\u002F\u002Fsynch.run\u002Fblog\u002Fencryption-and-decryption\u002F",[445],"Synchにおけるエンドツーエンド暗号化の仕組み",[1650,4047,4048],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}",{"title":425,"searchDepth":1067,"depth":1074,"links":4050},[4051,4060,4069,4070],{"id":2717,"depth":1067,"text":2718,"children":4052},[4053,4057],{"id":2760,"depth":1074,"text":2761,"children":4054},[4055,4056],{"id":2764,"depth":1081,"text":2764},{"id":2779,"depth":1081,"text":2780},{"id":3013,"depth":1074,"text":3014,"children":4058},[4059],{"id":3017,"depth":1081,"text":3018},{"id":3126,"depth":1067,"text":3127,"children":4061},[4062],{"id":3150,"depth":1074,"text":3151,"children":4063},[4064,4065,4066,4067,4068],{"id":3177,"depth":1081,"text":3178},{"id":3186,"depth":1081,"text":3187},{"id":3233,"depth":1081,"text":3234},{"id":3455,"depth":1081,"text":3455},{"id":3540,"depth":1081,"text":3541},{"id":3994,"depth":1067,"text":3994},{"id":1621,"depth":1067,"text":1621},[4072],"productivity","2026-09-15","Cloudflare Zero Trust環境において、自ホスト型のSynchとIgnisを導入し、複数デバイス間でObsidianの保管庫（Vault）を安全に同期・暗号化するとともに、ウェブブラウザ経由でノートを安全に閲覧・編集するための、強固なプライベートネットワーク構築手順を詳しく解説します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSync%20Obsidian%20Across%20Devices\u002FJA-Sync-Obsidian-Across-Devices.webp","セルフホストSynchとIgnisを使用し、Cloudflare Zero Trustプライベートネットワーク内で安全に複数デバイス間のObsidian保管庫を同期している図",{"schemaOrg":4078,"robots":1704,"sitemap":4082},[4079,4081],{"@type":4080,"headline":2658,"description":4074,"image":4075},"Article",{"@type":1683,"name":2658,"description":4074,"image":4075},{"lastmod":4083},"2026-09-16",{"title":4085,"description":4074,"ogTitle":2658,"ogDescription":4074,"twitterTitle":2658,"twitterDescription":4074},"Cloudflare Zero Trustによる安全なObsidian同期と自ホスト型Synch・Ignisの構築","ja\u002Farticle\u002Fsync-obsidian-across-devices",[4088,4089,4090,2652],"セルフホスト","Obsidian","同期","vLEe3YjLuAqtVGuhjnjR-zFGxNLCqkKj0P9t3ekqnWE",{"id":4093,"title":453,"author":425,"body":4094,"category":6219,"date":6220,"description":463,"extension":1675,"image":464,"imageAlt":465,"isPublished":1070,"meta":6221,"minRead":2288,"navigation":1070,"path":195,"seo":6243,"stem":6245,"tags":6246,"updatedAt":1713,"__hash__":6250},"article\u002Fja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues.md",{"type":427,"value":4095,"toc":6189},[4096,4099,4105,4111,4115,4118,4156,4160,4166,4204,4208,4212,4226,4232,4237,4241,4245,4259,4265,4313,4339,4343,4352,4358,4362,4365,4575,4579,4619,4624,4631,4639,4688,4694,4723,4727,4731,4751,4777,4782,4824,4833,5104,5108,5151,5156,5163,5167,5171,5195,5198,5204,5210,5214,5221,5227,5230,5236,5242,5266,5273,5279,5282,5288,5292,5295,5298,5301,5307,5310,5316,5322,5328,5333,5337,5348,5355,5361,5364,5370,5373,5380,5386,5392,5395,5403,5467,5476,5531,5534,5604,5610,5624,5630,5633,5678,5684,5687,5693,5696,5702,5706,5723,5739,5745,5842,5845,5851,5862,5908,5914,5920,5932,5948,5951,5957,5961,5968,5990,6000,6098,6110,6116,6123,6129,6132,6138,6141,6147,6150,6153,6156,6186],[430,4097,4098],{},"複数のAIエージェントと協働する際、最も厄介な障害となるのが「文脈（コンテキスト）の断片化」です。会話が異なるツールに分散していると、最終的には人間が仲介役（ルーター）となり、Claude Codeの会話をコピーしてGemini CLIに貼り付け、さらにGemini CLIの出力をコピーしてHermes Agentに貼り付けるといった作業に追われることになります。このような手間は、人間の同僚が同じチームに加わることで、さらに増大します。",[430,4100,4101],{},[433,4102],{"alt":4103,"src":4104},"チャットチャンネルとアクティブなAIエージェントを表示するBuzz協働ワークスペースのユーザーインターフェース","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-workspace-interface.webp",[430,4106,4107,4108,4110],{},"オープンソースの協働ワークスペースである",[448,4109,1108],{},"は、人間のチームとAIエージェントを単一の統合された環境にシームレスに融合させます。ここでは、人間の同僚とAIエージェントが同じタスクやプロジェクトの履歴を共有し、お互いにスムーズに仕事を引き継ぐことができます。",[472,4112,4114],{"id":4113},"blockのbuzzとは協働型aiエージェントワークスペース","Blockの「Buzz」とは？協働型AIエージェント・ワークスペース",[430,4116,4117],{},"Buzzは、Block（ジャック・ドーシーが率いる企業）が開発したオープンソースの協働ワークスペースであり、人間とAIエージェントが同じチャンネルやプロジェクトを共有して作業を行います。以下のような革新的な主要機能を備えています。",[481,4119,4120,4126,4132,4138,4144,4150],{},[484,4121,4122,4125],{},[448,4123,4124],{},"共有コンテキスト："," 人間とエージェントはチャンネルを通じて共同作業を行います。会話やプロジェクトの全履歴はチャンネル内に集約されます。",[484,4127,4128,4131],{},[448,4129,4130],{},"エージェント間通信："," エージェント同士は、異なるマシン間でさえも直接通信が可能です。あるエージェントが別のエージェントを@-メンションして仕事を引き継いだり、コードをクロスチェックしたりできます。",[484,4133,4134,4137],{},[448,4135,4136],{},"メンション駆動型アクティベーション："," エージェントは@-メンションされた時のみ作動し、それ以外はバックグラウンドで待機します。メンションされると、チャンネル内の関連文脈を読み取って作業を開始します。",[484,4139,4140,4143],{},[448,4141,4142],{},"統合されたアイデンティティ："," 人間とエージェントは同じアイデンティティ・システムを使用し、暗号鍵（クリプトグラフィック・キー）によって認証されます。",[484,4145,4146,4149],{},[448,4147,4148],{},"コマンドの委任："," 人間の同僚に対して、自分のエージェントに命令を下す権限を付与できます。これにより、チーム全体で互いのデジタルアシスタントに指示を出し、活用し合うことが可能になります。",[484,4151,4152,4155],{},[448,4153,4154],{},"セルフホスト対応："," サーバーをご自身でホストするため、データは完全に自身の管理下に置かれます。参加者の選定や運用ルールの定義も自由に行えます。",[472,4157,4159],{"id":4158},"暗号技術とnostrに支えられたbuzzのアーキテクチャ","暗号技術とNostrに支えられたBuzzのアーキテクチャ",[430,4161,4162],{},[433,4163],{"alt":4164,"src":4165},"暗号技術とNostrを搭載したBuzz協働ワークスペースのアーキテクチャ図","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-nostr-cryptographic-architecture.webp",[481,4167,4168,4174,4180,4186,4192,4198],{},[484,4169,4170,4173],{},[448,4171,4172],{},"Nostrリレーがサーバーとして機能："," メッセージ、ワークフロー、リポジトリ、その他のイベントは暗号署名および検証され、Nostrリレーサーバーに保存されます。Nostrプロトコルは、WebSocketおよびREST APIを介した通信をネイティブにサポートしています。",[484,4175,4176,4179],{},[448,4177,4178],{},"統合された暗号化アイデンティティ："," 人間とエージェントは、それぞれ独自の暗号鍵を使って認証を行います。このアイデンティティはクライアント側で管理され、サーバーに保存されることはありません。",[484,4181,4182,4185],{},[448,4183,4184],{},"ファーストクラスとしてのエージェント："," すべてエージェントは、独自のアイデンティティ、チャンネルメンバーシップ、および監査証跡（オーディット・トレイル）を保持します。エージェントは、Agent Communication Protocol (ACP) を介してワークスペースに接続します。",[484,4187,4188,4191],{},[448,4189,4190],{},"分散型Gitリポジトリ："," コードリポジトリはS3互換のオブジェクトストレージに保存され、タスク、プルリクエスト、コードレビューはNostrのイベントログ内で追跡されます。したがって、BuzzのGitリポジトリはGitHubではなく、Nostrリレー上でホストされます。",[484,4193,4194,4197],{},[448,4195,4196],{},"NostrクライアントとしてのBuzzアプリ："," BuzzはNostrリレーとは独立しており、リレーのURLに接続するデスクトップ\u002Fモバイル用のクライアントアプリケーションです。",[484,4199,4200,4203],{},[448,4201,4202],{},"インフラ構成："," PostgreSQLデータベースがイベント保存と全文検索を処理し、RedisがPub\u002FSubメッセージングを管理、S3互換のMinIOがメディアストレージとして使用されます。",[472,4205,4207],{"id":4206},"blockのbuzzリレーをlinux-vpsに自己ホストする方法","BlockのBuzzリレーをLinux VPSに自己ホストする方法",[885,4209,4211],{"id":4210},"_0-前提条件","0. 前提条件",[481,4213,4214,4217,4220,4223],{},[484,4215,4216],{},"Linux VPS",[484,4218,4219],{},"ドメインがサーバーを指していること",[484,4221,4222],{},"DockerおよびDocker Composeプラグイン",[484,4224,4225],{},"Cloudflareアカウント（無料プラン）",[430,4227,2689,4228,4231],{},[441,4229,4230],{"href":363},"Cloudflare WARPでHermes Agentをプライベート ネットワークに公開する方法","を使用して、Cloudflareのプライベートネットワークの背後にあるUbuntu VPS上でNostrリレーを実行します。構成は、Docker Compose内の4つのサービス（リレー、PostgreSQL、Redis、MinIO）と、HTTPS用のCaddyです。",[461,4233],{"description":4234,"image":2612,"image-alt":4235,"label":4236,"min-read":2713,"title":4230,"to":363},"インバウンドのファイアウォールポートを開くことなく、Cloudflare WARPとZero Trustを使用してHermes Agentをグローバルに安全に公開し、アクセスする方法を学びます。","Cloudflare Zero TrustとWARPトンネルを使用してHermes Agentをプライベートネットワークに安全に公開する様子","関連ガイド",[885,4238,4240],{"id":4239},"_1-cloudflare-dnsとapiトークン","1. Cloudflare DNSとAPIトークン",[2166,4242,4244],{"id":4243},"cloudflare-apiトークンの作成","Cloudflare APIトークンの作成",[529,4246,4247,4254],{},[484,4248,4249,4250,4253],{},"右上のユーザーアイコンのドロップダウンメニューから、",[448,4251,4252],{},"Profile","をクリックします。",[484,4255,4256,4253],{},[448,4257,4258],{},"API Tokens",[430,4260,4261],{},[433,4262],{"alt":4263,"src":4264},"APIトークン作成メニューを表示するCloudflareのユーザープロファイルページ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-profile-api-tokens.webp",[529,4266,4267,4272,4278,4298,4303,4307,4310],{"start":1074},[484,4268,4269,4253],{},[448,4270,4271],{},"Create Token",[484,4273,4274,4277],{},[448,4275,4276],{},"Edit zone DNS","のテンプレートを使用します。",[484,4279,4280,4281],{},"テンプレートを以下のように構成します：\n",[481,4282,4283,4289],{},[484,4284,4285,4288],{},[448,4286,4287],{},"Permissions",": Zone — DNS — Edit",[484,4290,4291,4294,4295],{},[448,4292,4293],{},"Zone Resources",": Include — Specific zone — ",[491,4296,4297],{},"example.com",[484,4299,4300,4253],{},[448,4301,4302],{},"Continue to summary",[484,4304,4305,4253],{},[448,4306,4271],{},[484,4308,4309],{},"生成されたトークンはページを閉じると再表示されないため、必ずコピーしておいてください。",[484,4311,4312],{},"ターミナルで生成されたトークンが動作するか確認します：",[930,4314,4316],{"className":1038,"code":4315,"language":1040,"meta":425,"style":425},"curl \"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify\" -H \"Authorization: Bearer YOUR_TOKEN_HERE\"\n",[491,4317,4318],{"__ignoreMap":425},[938,4319,4320,4322,4324,4327,4329,4332,4334,4337],{"class":940,"line":941},[938,4321,2997],{"class":1047},[938,4323,3285],{"class":952},[938,4325,4326],{"class":1051},"https:\u002F\u002Fapi.cloudflare.com\u002Fclient\u002Fv4\u002Fuser\u002Ftokens\u002Fverify",[938,4328,3687],{"class":952},[938,4330,4331],{"class":1051}," -H",[938,4333,3285],{"class":952},[938,4335,4336],{"class":1051},"Authorization: Bearer YOUR_TOKEN_HERE",[938,4338,1965],{"class":952},[2166,4340,4342],{"id":4341},"dnsレコード","DNSレコード",[481,4344,4345],{},[484,4346,4347,4348,4351],{},"Aレコードを作成し、プロキシステータスを「",[448,4349,4350],{},"DNS only","」（DNSのみ）に設定します。",[430,4353,4354],{},[433,4355],{"alt":4356,"src":4357},"プロキシステータスをDNSのみに設定してCloudflareダッシュボードでBuzzドメインのDNS Aレコードを設定する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fcloudflare-dns-a-record-configuration.webp",[885,4359,4361],{"id":4360},"_2-ubuntuへのdockerのインストール","2. UbuntuへのDockerのインストール",[430,4363,4364],{},"以下のコマンドを実行して、UbuntuにDockerをインストールします：",[930,4366,4368],{"className":1038,"code":4367,"language":1040,"meta":425,"style":425},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Start automatically when the system boots\nsudo systemctl enable docker\n\n# Verify docker is installed\ndocker --version\n\nsudo apt install -y docker-compose-plugin\n\n# Verify the compose plugin is installed\ndocker compose version\n\n",[491,4369,4370,4375,4403,4407,4412,4454,4458,4463,4473,4477,4482,4503,4507,4512,4523,4527,4532,4538,4542,4556,4560,4565],{"__ignoreMap":425},[938,4371,4372],{"class":940,"line":941},[938,4373,4374],{"class":1077},"# Add Docker's official GPG key and set up the Docker repository\n",[938,4376,4377,4379,4382,4385,4388,4391,4394,4397,4400],{"class":940,"line":1067},[938,4378,2997],{"class":1047},[938,4380,4381],{"class":1051}," -fsSL",[938,4383,4384],{"class":1051}," https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg",[938,4386,4387],{"class":952}," |",[938,4389,4390],{"class":1047}," sudo",[938,4392,4393],{"class":1051}," gpg",[938,4395,4396],{"class":1051}," --dearmor",[938,4398,4399],{"class":1051}," -o",[938,4401,4402],{"class":1051}," \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n",[938,4404,4405],{"class":940,"line":1074},[938,4406,1071],{"emptyLinePlaceholder":1070},[938,4408,4409],{"class":940,"line":1081},[938,4410,4411],{"class":1077},"# Add the official Docker repository\n",[938,4413,4414,4417,4419,4422,4425,4428,4431,4434,4437,4439,4441,4443,4445,4448,4451],{"class":940,"line":1933},[938,4415,4416],{"class":970},"echo",[938,4418,3285],{"class":952},[938,4420,4421],{"class":1051},"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu ",[938,4423,4424],{"class":952},"$(",[938,4426,4427],{"class":1047},"lsb_release",[938,4429,4430],{"class":1051}," -cs",[938,4432,4433],{"class":952},")",[938,4435,4436],{"class":1051}," stable",[938,4438,3687],{"class":952},[938,4440,4387],{"class":952},[938,4442,4390],{"class":1047},[938,4444,3811],{"class":1051},[938,4446,4447],{"class":1051}," \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list",[938,4449,4450],{"class":952}," >",[938,4452,4453],{"class":1051}," \u002Fdev\u002Fnull\n",[938,4455,4456],{"class":940,"line":1938},[938,4457,1071],{"emptyLinePlaceholder":1070},[938,4459,4460],{"class":940,"line":1944},[938,4461,4462],{"class":1077},"# Update package list\n",[938,4464,4465,4467,4470],{"class":940,"line":2277},[938,4466,1901],{"class":1047},[938,4468,4469],{"class":1051}," apt",[938,4471,4472],{"class":1051}," update\n",[938,4474,4475],{"class":940,"line":2288},[938,4476,1071],{"emptyLinePlaceholder":1070},[938,4478,4479],{"class":940,"line":2384},[938,4480,4481],{"class":1077},"# Install Docker Engine, Docker Community Edition, and containerd runtime\n",[938,4483,4484,4486,4488,4491,4494,4497,4500],{"class":940,"line":2390},[938,4485,1901],{"class":1047},[938,4487,4469],{"class":1051},[938,4489,4490],{"class":1051}," install",[938,4492,4493],{"class":1051}," docker-ce",[938,4495,4496],{"class":1051}," docker-ce-cli",[938,4498,4499],{"class":1051}," containerd.io",[938,4501,4502],{"class":1051}," -y\n",[938,4504,4505],{"class":940,"line":2396},[938,4506,1071],{"emptyLinePlaceholder":1070},[938,4508,4509],{"class":940,"line":2401},[938,4510,4511],{"class":1077},"# Start automatically when the system boots\n",[938,4513,4514,4516,4518,4520],{"class":940,"line":2407},[938,4515,1901],{"class":1047},[938,4517,1904],{"class":1051},[938,4519,2030],{"class":1051},[938,4521,4522],{"class":1051}," docker\n",[938,4524,4525],{"class":940,"line":1706},[938,4526,1071],{"emptyLinePlaceholder":1070},[938,4528,4529],{"class":940,"line":3364},[938,4530,4531],{"class":1077},"# Verify docker is installed\n",[938,4533,4534,4536],{"class":940,"line":3369},[938,4535,1181],{"class":1047},[938,4537,3610],{"class":1051},[938,4539,4540],{"class":940,"line":3377},[938,4541,1071],{"emptyLinePlaceholder":1070},[938,4543,4544,4546,4548,4550,4553],{"class":940,"line":3901},[938,4545,1901],{"class":1047},[938,4547,4469],{"class":1051},[938,4549,4490],{"class":1051},[938,4551,4552],{"class":1051}," -y",[938,4554,4555],{"class":1051}," docker-compose-plugin\n",[938,4557,4558],{"class":940,"line":3907},[938,4559,1071],{"emptyLinePlaceholder":1070},[938,4561,4562],{"class":940,"line":3916},[938,4563,4564],{"class":1077},"# Verify the compose plugin is installed\n",[938,4566,4568,4570,4572],{"class":940,"line":4567},22,[938,4569,1181],{"class":1047},[938,4571,1184],{"class":1051},[938,4573,4574],{"class":1051}," version\n",[885,4576,4578],{"id":4577},"_3-クローンと設定","3. クローンと設定",[930,4580,4582],{"className":1038,"code":4581,"language":1040,"meta":425,"style":425},"git clone https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n\ncd buzz\u002Fdeploy\u002Fcompose\ncp .env.example .env\nnano .env\n",[491,4583,4584,4593,4597,4604,4612],{"__ignoreMap":425},[938,4585,4586,4588,4590],{"class":940,"line":941},[938,4587,2794],{"class":1047},[938,4589,2797],{"class":1051},[938,4591,4592],{"class":1051}," https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz.git\n",[938,4594,4595],{"class":940,"line":1067},[938,4596,1071],{"emptyLinePlaceholder":1070},[938,4598,4599,4601],{"class":940,"line":1074},[938,4600,2818],{"class":970},[938,4602,4603],{"class":1051}," buzz\u002Fdeploy\u002Fcompose\n",[938,4605,4606,4608,4610],{"class":940,"line":1081},[938,4607,2835],{"class":1047},[938,4609,2838],{"class":1051},[938,4611,2841],{"class":1051},[938,4613,4614,4617],{"class":940,"line":1933},[938,4615,4616],{"class":1047},"nano",[938,4618,2841],{"class":1051},[430,4620,4621,4623],{},[491,4622,2847],{},"ファイルをグループごとに編集します：",[481,4625,4626],{},[484,4627,4628],{},[448,4629,4630],{},"ドメイン設定:",[930,4632,4637],{"className":4633,"code":4635,"language":4636},[4634],"language-text","BUZZ_DOMAIN=buzz.pafor.me\nRELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\nBUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_MEDIA_BASE_URL=https:\u002F\u002Fbuzz.pafor.me\u002Fmedia\nBUZZ_MEDIA_SERVER_DOMAIN=buzz.pafor.me\nBUZZ_CORS_ORIGINS=https:\u002F\u002Fbuzz.pafor.me\n","text",[491,4638,4635],{"__ignoreMap":425},[481,4640,4641,4651],{},[484,4642,4643,4646,4647,4650],{},[448,4644,4645],{},"オーナーキー設定:"," ",[491,4648,4649],{},"RELAY_OWNER_PUBKEY","には、64文字の16進数パブリックキー（公開鍵）を設定する必要があります。まずデスクトップアプリでアイデンティティを生成し（「Create a new identity key」→npub形式のパブリックIDをコピー）、それを16進数（Hex）に変換します。",[484,4652,4653,4656],{},[448,4654,4655],{},"シークレット（Secrets）の設定:",[481,4657,4658,4667,4681],{},[484,4659,4660,4663,4664,4666],{},[441,4661,4662],{"href":2868},"オンラインツール","を使用するか、",[491,4665,2873],{},"を実行（計7回実行）して、シークレットキーを生成します。",[484,4668,4669,4670,4673,4674,1524,4677,4680],{},"すべての",[491,4671,4672],{},"CHANGE_ME","プレースホルダーを置き換えます：",[491,4675,4676],{},"BUZZ_RELAY_PRIVATE_KEY",[491,4678,4679],{},"BUZZ_GIT_HOOK_HMAC_SECRET","、Postgres\u002FRedis\u002FTypesenseのパスワード、およびS3のアクセスキー\u002Fシークレットキー。",[484,4682,4683,4684,4687],{},"プレースホルダーが残っていると、コンテナが再起動ループに陥る最も一般的な原因になります。",[491,4685,4686],{},"grep CHANGE_ME .env","を実行して、変更漏れがないか確認してください。",[930,4689,4692],{"className":4690,"code":4691,"language":4636},[4634],"    BUZZ_RELAY_PRIVATE_KEY=CHANGE_ME_64_HEX_PRIVATE_KEY\n    BUZZ_GIT_HOOK_HMAC_SECRET=CHANGE_ME_RANDOM_64_HEX\n    POSTGRES_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    REDIS_PASSWORD=CHANGE_ME_RANDOM_PASSWORD\n    TYPESENSE_API_KEY=CHANGE_ME_RANDOM_API_KEY\n    BUZZ_S3_ACCESS_KEY=CHANGE_ME_RANDOM_ACCESS_KEY\n    BUZZ_S3_SECRET_KEY=CHANGE_ME_RANDOM_SECRET_KEY\n",[491,4693,4691],{"__ignoreMap":425},[481,4695,4696],{},[484,4697,4698,4701],{},[448,4699,4700],{},"その他の設定:",[481,4702,4703,4710],{},[484,4704,4705,4706,4709],{},"先ほど生成したAPIトークンを環境変数",[491,4707,4708],{},"CLOUDFLARE_API_TOKEN","として追加します。これはCaddyの自動証明書更新に必要です。",[484,4711,4712,4713,4715,4716,571,4719,4722],{},"Buzzはデフォルトで誰でも参加できるオープンな設定になっています。安全のために",[491,4714,4649],{},"を設定し、",[491,4717,4718],{},"BUZZ_REQUIRE_RELAY_MEMBERSHIP=true",[491,4720,4721],{},"BUZZ_REQUIRE_AUTH_TOKEN=true","を有効にしてください。",[885,4724,4726],{"id":4725},"_4-caddyによるhttpsの有効化","4. CaddyによるHTTPSの有効化",[2166,4728,4730],{"id":4729},"cloudflare-dnsモジュールを組み込んだカスタムcaddyイメージのビルド","Cloudflare DNSモジュールを組み込んだカスタムCaddyイメージのビルド",[481,4732,4733,4748],{},[484,4734,4735,4736,4739,4740,4743,4744,4747],{},"CaddyにCloudflareを用いたDNS-01チャレンジを設定します。DNS-01は、プラグインが",[448,4737,4738],{},"パブリックDNS","にTXTレコード",[491,4741,4742],{},"_acme-challenge.buzz.pafor.me","を書き込み、Let's Encryptがパブリックインターネット経由でそのレコードを確認してドメインの所有権を検証する仕組みです。そのため、",[491,4745,4746],{},"pafor.me","がCloudflareアカウント上でパブリックゾーンとして登録されている必要があります（Zero Trust\u002FWARPのプライベートDNS内だけに存在するプライベートホスト名では動作しません）。プライベートにしか解決できない場合、DNS-01は失敗し、別の証明書取得アプローチが必要になります。",[484,4749,4750],{},"Caddyfileに以下を追記します：",[930,4752,4754],{"className":1350,"code":4753,"language":1352,"meta":425,"style":425},"{\n  acme_dns cloudflare {env.CLOUDFLARE_API_TOKEN}\n}\n",[491,4755,4756,4760,4773],{"__ignoreMap":425},[938,4757,4758],{"class":940,"line":941},[938,4759,2921],{"class":952},[938,4761,4762,4765,4768,4771],{"class":940,"line":1067},[938,4763,4764],{"class":1051},"  acme_dns cloudflare",[938,4766,4767],{"class":952}," {",[938,4769,4770],{"class":1051},"env.CLOUDFLARE_API_TOKEN",[938,4772,2929],{"class":952},[938,4774,4775],{"class":940,"line":1074},[938,4776,2929],{"class":952},[481,4778,4779],{},[484,4780,4781],{},"Dockerfile.caddyを以下の内容で作成します（compose.caddy.ymlから呼び出されます）：",[930,4783,4785],{"className":1350,"code":4784,"language":1352,"meta":425,"style":425},"FROM caddy:2-builder AS builder\n\nRUN xcaddy build \\\n    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n\nFROM caddy:2-alpine\n\nCOPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[491,4786,4787,4792,4796,4801,4806,4810,4815,4819],{"__ignoreMap":425},[938,4788,4789],{"class":940,"line":941},[938,4790,4791],{"class":1051},"FROM caddy:2-builder AS builder\n",[938,4793,4794],{"class":940,"line":1067},[938,4795,1071],{"emptyLinePlaceholder":1070},[938,4797,4798],{"class":940,"line":1074},[938,4799,4800],{"class":1051},"RUN xcaddy build \\\n",[938,4802,4803],{"class":940,"line":1081},[938,4804,4805],{"class":1051},"    --with github.com\u002Fcaddy-dns\u002Fcloudflare\n",[938,4807,4808],{"class":940,"line":1933},[938,4809,1071],{"emptyLinePlaceholder":1070},[938,4811,4812],{"class":940,"line":1938},[938,4813,4814],{"class":1051},"FROM caddy:2-alpine\n",[938,4816,4817],{"class":940,"line":1944},[938,4818,1071],{"emptyLinePlaceholder":1070},[938,4820,4821],{"class":940,"line":2277},[938,4822,4823],{"class":1051},"COPY --from=builder \u002Fusr\u002Fbin\u002Fcaddy \u002Fusr\u002Fbin\u002Fcaddy\n",[481,4825,4826],{},[484,4827,4828,4829,4832],{},"Cloudflareモジュールを含むイメージを使用し、APIトークンを渡すように",[491,4830,4831],{},"compose.caddy.yml","を編集します：",[930,4834,4836],{"className":1350,"code":4835,"language":1352,"meta":425,"style":425},"services:\n  relay:\n    ports: !reset []\n\n  caddy:\n    build:\n      context: .\n      dockerfile: Dockerfile.caddy\n    image: buzz-caddy:cloudflare\n    depends_on:\n      relay:\n        condition: service_healthy\n    environment:\n      BUZZ_DOMAIN: ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n      CLOUDFLARE_API_TOKEN: ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n    ports:\n      - \"${CADDY_HTTP_PORT:-80}:80\"\n      - \"${CADDY_HTTPS_PORT:-443}:443\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n      - buzz-caddy-data:\u002Fdata\n      - buzz-caddy-config:\u002Fconfig\n    restart: unless-stopped\n    networks:\n      - buzz-net\n\nvolumes:\n  buzz-caddy-data:\n    labels:\n      com.buzz.volume: caddy-data\n  buzz-caddy-config:\n    labels:\n      com.buzz.volume: caddy-config\n",[491,4837,4838,4844,4851,4863,4867,4874,4881,4891,4901,4910,4917,4924,4934,4940,4950,4960,4966,4977,4988,4994,5001,5008,5015,5024,5032,5040,5045,5052,5060,5068,5079,5087,5094],{"__ignoreMap":425},[938,4839,4840,4842],{"class":940,"line":941},[938,4841,3251],{"class":1362},[938,4843,1377],{"class":952},[938,4845,4846,4849],{"class":940,"line":1067},[938,4847,4848],{"class":1362},"  relay",[938,4850,1377],{"class":952},[938,4852,4853,4855,4857,4860],{"class":940,"line":1074},[938,4854,3275],{"class":1362},[938,4856,1366],{"class":952},[938,4858,4859],{"class":944}," !reset",[938,4861,4862],{"class":952}," []\n",[938,4864,4865],{"class":940,"line":1081},[938,4866,1071],{"emptyLinePlaceholder":1070},[938,4868,4869,4872],{"class":940,"line":1933},[938,4870,4871],{"class":1362},"  caddy",[938,4873,1377],{"class":952},[938,4875,4876,4879],{"class":940,"line":1938},[938,4877,4878],{"class":1362},"    build",[938,4880,1377],{"class":952},[938,4882,4883,4886,4888],{"class":940,"line":1944},[938,4884,4885],{"class":1362},"      context",[938,4887,1366],{"class":952},[938,4889,4890],{"class":2966}," .\n",[938,4892,4893,4896,4898],{"class":940,"line":2277},[938,4894,4895],{"class":1362},"      dockerfile",[938,4897,1366],{"class":952},[938,4899,4900],{"class":1051}," Dockerfile.caddy\n",[938,4902,4903,4905,4907],{"class":940,"line":2288},[938,4904,3265],{"class":1362},[938,4906,1366],{"class":952},[938,4908,4909],{"class":1051}," buzz-caddy:cloudflare\n",[938,4911,4912,4915],{"class":940,"line":2384},[938,4913,4914],{"class":1362},"    depends_on",[938,4916,1377],{"class":952},[938,4918,4919,4922],{"class":940,"line":2390},[938,4920,4921],{"class":1362},"      relay",[938,4923,1377],{"class":952},[938,4925,4926,4929,4931],{"class":940,"line":2396},[938,4927,4928],{"class":1362},"        condition",[938,4930,1366],{"class":952},[938,4932,4933],{"class":1051}," service_healthy\n",[938,4935,4936,4938],{"class":940,"line":2401},[938,4937,3295],{"class":1362},[938,4939,1377],{"class":952},[938,4941,4942,4945,4947],{"class":940,"line":2407},[938,4943,4944],{"class":1362},"      BUZZ_DOMAIN",[938,4946,1366],{"class":952},[938,4948,4949],{"class":1051}," ${BUZZ_DOMAIN:?set BUZZ_DOMAIN}\n",[938,4951,4952,4955,4957],{"class":940,"line":1706},[938,4953,4954],{"class":1362},"      CLOUDFLARE_API_TOKEN",[938,4956,1366],{"class":952},[938,4958,4959],{"class":1051}," ${CLOUDFLARE_API_TOKEN:?set CLOUDFLARE_API_TOKEN}\n",[938,4961,4962,4964],{"class":940,"line":3364},[938,4963,3275],{"class":1362},[938,4965,1377],{"class":952},[938,4967,4968,4970,4972,4975],{"class":940,"line":3369},[938,4969,3282],{"class":952},[938,4971,3285],{"class":952},[938,4973,4974],{"class":1051},"${CADDY_HTTP_PORT:-80}:80",[938,4976,1965],{"class":952},[938,4978,4979,4981,4983,4986],{"class":940,"line":3377},[938,4980,3282],{"class":952},[938,4982,3285],{"class":952},[938,4984,4985],{"class":1051},"${CADDY_HTTPS_PORT:-443}:443",[938,4987,1965],{"class":952},[938,4989,4990,4992],{"class":940,"line":3901},[938,4991,3328],{"class":1362},[938,4993,1377],{"class":952},[938,4995,4996,4998],{"class":940,"line":3907},[938,4997,3282],{"class":952},[938,4999,5000],{"class":1051}," .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile:ro\n",[938,5002,5003,5005],{"class":940,"line":3916},[938,5004,3282],{"class":952},[938,5006,5007],{"class":1051}," buzz-caddy-data:\u002Fdata\n",[938,5009,5010,5012],{"class":940,"line":4567},[938,5011,3282],{"class":952},[938,5013,5014],{"class":1051}," buzz-caddy-config:\u002Fconfig\n",[938,5016,5018,5020,5022],{"class":940,"line":5017},23,[938,5019,3356],{"class":1362},[938,5021,1366],{"class":952},[938,5023,3361],{"class":1051},[938,5025,5027,5030],{"class":940,"line":5026},24,[938,5028,5029],{"class":1362},"    networks",[938,5031,1377],{"class":952},[938,5033,5035,5037],{"class":940,"line":5034},25,[938,5036,3282],{"class":952},[938,5038,5039],{"class":1051}," buzz-net\n",[938,5041,5043],{"class":940,"line":5042},26,[938,5044,1071],{"emptyLinePlaceholder":1070},[938,5046,5048,5050],{"class":940,"line":5047},27,[938,5049,3372],{"class":1362},[938,5051,1377],{"class":952},[938,5053,5055,5058],{"class":940,"line":5054},28,[938,5056,5057],{"class":1362},"  buzz-caddy-data",[938,5059,1377],{"class":952},[938,5061,5063,5066],{"class":940,"line":5062},29,[938,5064,5065],{"class":1362},"    labels",[938,5067,1377],{"class":952},[938,5069,5071,5074,5076],{"class":940,"line":5070},30,[938,5072,5073],{"class":1362},"      com.buzz.volume",[938,5075,1366],{"class":952},[938,5077,5078],{"class":1051}," caddy-data\n",[938,5080,5082,5085],{"class":940,"line":5081},31,[938,5083,5084],{"class":1362},"  buzz-caddy-config",[938,5086,1377],{"class":952},[938,5088,5090,5092],{"class":940,"line":5089},32,[938,5091,5065],{"class":1362},[938,5093,1377],{"class":952},[938,5095,5097,5099,5101],{"class":940,"line":5096},33,[938,5098,5073],{"class":1362},[938,5100,1366],{"class":952},[938,5102,5103],{"class":1051}," caddy-config\n",[2166,5105,5107],{"id":5106},"dockerコンテナの起動","Dockerコンテナの起動",[930,5109,5111],{"className":1038,"code":5110,"language":1040,"meta":425,"style":425},"docker compose -f compose.yml -f compose.caddy.yml up -d\n\n#Check the Docker status\ndocker compose ps\n",[491,5112,5113,5133,5137,5142],{"__ignoreMap":425},[938,5114,5115,5117,5119,5121,5124,5126,5129,5131],{"class":940,"line":941},[938,5116,1181],{"class":1047},[938,5118,1184],{"class":1051},[938,5120,3434],{"class":1051},[938,5122,5123],{"class":1051}," compose.yml",[938,5125,3434],{"class":1051},[938,5127,5128],{"class":1051}," compose.caddy.yml",[938,5130,2988],{"class":1051},[938,5132,2991],{"class":1051},[938,5134,5135],{"class":940,"line":1067},[938,5136,1071],{"emptyLinePlaceholder":1070},[938,5138,5139],{"class":940,"line":1074},[938,5140,5141],{"class":1077},"#Check the Docker status\n",[938,5143,5144,5146,5148],{"class":940,"line":1081},[938,5145,1181],{"class":1047},[938,5147,1184],{"class":1051},[938,5149,5150],{"class":1051}," ps\n",[433,5152],{"src":5153,"alt":5154,"style":5155},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fdocker-compose-ps-status-terminal.webp","docker compose psを実行してBuzzサービスのコンテナ稼働状態を表示するターミナル画面","max-width: 700px; width: 100%; height: auto;",[430,5157,5158,5159,5162],{},"ブラウザを開き、",[491,5160,5161],{},"http:\u002F\u002Fbuzz.pafor.me","にアクセスしてリレーが正常に稼働しているか確認します。",[433,5164],{"src":5165,"alt":5166,"style":3115},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-relay-running-browser-verification.webp","自己ホストしたBlockのBuzzリレーからの正常な応答を表示するブラウザの検証画面",[885,5168,5170],{"id":5169},"ステップ-5初日からの自動バックアップ設定","ステップ 5：初日からの自動バックアップ設定",[930,5172,5174],{"className":1038,"code":5173,"language":1040,"meta":425,"style":425},"mkdir -p \u002Fbuzz_backups\ncrontab -e\n",[491,5175,5176,5187],{"__ignoreMap":425},[938,5177,5178,5181,5184],{"class":940,"line":941},[938,5179,5180],{"class":1047},"mkdir",[938,5182,5183],{"class":1051}," -p",[938,5185,5186],{"class":1051}," \u002Fbuzz_backups\n",[938,5188,5189,5192],{"class":940,"line":1067},[938,5190,5191],{"class":1047},"crontab",[938,5193,5194],{"class":1051}," -e\n",[430,5196,5197],{},"毎晩データベースのダンプを出力するcronジョブを設定します：",[930,5199,5202],{"className":5200,"code":5201,"language":4636},[4634],"0 3 * * * cd \u002Fhome\u002F\u003Cuser>\u002Fbuzz\u002Fdeploy\u002Fcompose && docker compose exec -T postgres pg_dump -U buzz buzz > \u002Fbuzz_backups\u002Fbuzz-$(date +\\%Y\\%m\\%d).sql\n",[491,5203,5201],{"__ignoreMap":425},[430,5205,5206,5207,5209],{},"注意：",[491,5208,4676],{},"は恒久的なものとして厳重に管理してください。このキーで署名されたイベントは、キーが変更されると検証に失敗します。データベースをリストアしても、新しい鍵と組み合わせた場合は同じリレーとして認識されません。",[472,5211,5213],{"id":5212},"buzzデスクトップクライアントとnostrアイデンティティのセットアップ","BuzzデスクトップクライアントとNostrアイデンティティのセットアップ",[430,5215,5216,5220],{},[441,5217,5218],{"href":5218,"rel":5219},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Freleases",[445]," からBuzzデスクトップアプリをダウンロードして起動します。プロファイルの設定を進め、「Join or create a community」のページまで進みます。",[430,5222,5223],{},[433,5224],{"alt":5225,"src":5226},"コミュニティへの参加または作成を行うBuzzデスクトップクライアントの初期セットアップ画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-setup-community.webp",[430,5228,5229],{},"「Join a community」をクリックし、ご自身のパブリックキー（公開鍵）をコピーします。",[430,5231,5232],{},[433,5233],{"alt":5234,"src":5235},"コミュニティに参加する前に公開鍵アイデンティティを表示するBuzzクライアント画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-join-community-public-key.webp",[430,5237,5238,5241],{},[448,5239,5240],{},"VPS上","で以下のコマンドを実行し、自身を最初のメンバーとして追加します：",[930,5243,5245],{"className":1038,"code":5244,"language":1040,"meta":425,"style":425},"docker compose exec relay buzz-admin add-member --pubkey npub1yourkeyhere\n",[491,5246,5247],{"__ignoreMap":425},[938,5248,5249,5251,5253,5255,5257,5259,5261,5263],{"class":940,"line":941},[938,5250,1181],{"class":1047},[938,5252,1184],{"class":1051},[938,5254,1187],{"class":1051},[938,5256,1190],{"class":1051},[938,5258,1193],{"class":1051},[938,5260,1196],{"class":1051},[938,5262,1199],{"class":1051},[938,5264,5265],{"class":1051}," npub1yourkeyhere\n",[430,5267,5268,5269,5272],{},"コミュニティURLに",[491,5270,5271],{},"wss:\u002F\u002Fbuzz.pafor.me","を入力し、「Next」をクリックします。",[430,5274,5275],{},[433,5276],{"alt":5277,"src":5278},"Buzzデスクトップアプリに自己ホストしたコミュニティリレーのURLを入力する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-input-community-url.webp",[430,5280,5281],{},"表示名を入力し、「Next」ボタンをクリックします。",[430,5283,5284],{},[433,5285],{"alt":5286,"src":5287},"表示名を入力するBuzzアプリのプロファイル設定画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-profile-name-input.webp",[885,5289,5291],{"id":5290},"チャンネルとaiエージェント","チャンネルとAIエージェント",[430,5293,5294],{},"チャンネルはタスクやプロジェクトごとのグループです。タスクごとにチャンネルを作成し、人間とAIエージェントをそこに参加させます。",[430,5296,5297],{},"チャンネル内のすべてのアクティビティは自動的に共有されるため、各メンバーに個別に指示を繰り返す必要はありません。すべてのエージェントは「@」を使ってメンションでき、該当のメッセージ履歴を読み込みます。また、エージェント同士が互いにメンションし合うことも可能です。",[430,5299,5300],{},"事前に設定されたエージェントにダイレクトメッセージ（DM）を送信してみましょう",[430,5302,5303],{},[433,5304],{"alt":5305,"src":5306},"Buzz協働デスクトップクライアントでAIエージェントにダイレクトメッセージを送信する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-dm-agent.webp",[430,5308,5309],{},"チャンネルを作成し、いくつかのエージェントを追加してみましょう",[430,5311,5312],{},[433,5313],{"alt":5314,"src":5315},"Buzzデスクトップアプリ内で新しいタスクまたはプロジェクトのチャンネルを作成する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-create-channel-dialog.webp",[430,5317,5318],{},[433,5319],{"alt":5320,"src":5321},"新しく作成したチャンネルに人間のメンバーとAIエージェントを追加する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-agents-to-channel.webp",[430,5323,5324],{},[433,5325],{"alt":5326,"src":5327},"統合されたチャット履歴とプロジェクトタスクを表示するアクティブなチャンネル画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-view.webp",[433,5329],{"src":5330,"alt":5331,"style":5332},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-channel-active-agents.webp","コラボレーションプロジェクトチャンネルに統合されたアクティブなAIエージェントの詳細ビュー","max-width: 367px; width: 100%; height: auto;",[885,5334,5336],{"id":5335},"エージェントランタイムの有効化","エージェント・ランタイムの有効化",[430,5338,5339,5340,5343,5344,5347],{},"プリセットされたランタイムは、",[491,5341,5342],{},"~\u002F.local\u002Fbin","などの標準ディレクトリにある起動用バイナリ（例：",[491,5345,5346],{},"hermes-acp","）の自動検出に依存しています。非標準の場所にツールがインストールされている場合、Buzzはそれを検出できません。",[430,5349,5350,5351,5354],{},"Kimi Codeの場合、エージェントIDはkimiであり、Buzzは",[491,5352,5353],{},"~\u002F.local\u002Fbin\u002Fkimi","にあるバイナリを探します。以下のようにシンボリックリンクを作成することで解決できます。",[930,5356,5359],{"className":5357,"code":5358,"language":4636},[4634],"ln -s kimi-cli \u002FUsers\u002F\u003Cuser>\u002F.local\u002Fbin\u002Fkimi\n",[491,5360,5358],{"__ignoreMap":425},[430,5362,5363],{},"これにより、Kimi Codeがエージェントのランタイム一覧に表示されます。",[430,5365,5366],{},[433,5367],{"alt":5368,"src":5369},"Kimiを含む設定済みのAIエージェントランタイムを表示するBuzzアプリの設定画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-agent-runtimes-list.webp",[885,5371,5372],{"id":5372},"プロジェクトとリポジトリ",[430,5374,5375,5376,5379],{},"まず、Settings → Experimentsで「",[448,5377,5378],{},"Projects","」機能を有効化します：",[430,5381,5382],{},[433,5383],{"alt":5384,"src":5385},"Buzzの設定タブで実験的機能である「Projects」を有効にする様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-experiments-projects.webp",[430,5387,5388,5389,5391],{},"現時点では、プロジェクトの作成は",[491,5390,1211],{},"を介して行う必要があります（将来のリリースではUIから直接作成可能になる予定です）。",[2166,5393,5394],{"id":5394},"buzz-cliのインストール",[430,5396,5397,5399,5400,5402],{},[448,5398,5240],{},"で以下のコマンドを実行し、",[491,5401,1211],{},"をインストールします：",[930,5404,5406],{"className":1038,"code":5405,"language":1040,"meta":425,"style":425},"sudo apt install cargo\ncd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-cli\necho 'export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"' >> ~\u002F.bashrc && source ~\u002F.bashrc\n",[491,5407,5408,5419,5426,5439],{"__ignoreMap":425},[938,5409,5410,5412,5414,5416],{"class":940,"line":941},[938,5411,1901],{"class":1047},[938,5413,4469],{"class":1051},[938,5415,4490],{"class":1051},[938,5417,5418],{"class":1051}," cargo\n",[938,5420,5421,5423],{"class":940,"line":1067},[938,5422,2818],{"class":970},[938,5424,5425],{"class":1051}," ~\u002Fbuzz\n",[938,5427,5428,5431,5433,5436],{"class":940,"line":1074},[938,5429,5430],{"class":1047},"cargo",[938,5432,4490],{"class":1051},[938,5434,5435],{"class":1051}," --path",[938,5437,5438],{"class":1051}," crates\u002Fbuzz-cli\n",[938,5440,5441,5443,5446,5449,5452,5455,5458,5461,5464],{"class":940,"line":1081},[938,5442,4416],{"class":970},[938,5444,5445],{"class":952}," '",[938,5447,5448],{"class":1051},"export PATH=\"$HOME\u002F.cargo\u002Fbin:$PATH\"",[938,5450,5451],{"class":952},"'",[938,5453,5454],{"class":952}," >>",[938,5456,5457],{"class":1051}," ~\u002F.bashrc",[938,5459,5460],{"class":952}," &&",[938,5462,5463],{"class":970}," source",[938,5465,5466],{"class":1051}," ~\u002F.bashrc\n",[430,5468,5469,5470,5472,5473,5475],{},"オンラインツールまたは",[491,5471,1211],{},"を使用して公開鍵と秘密鍵のペアを生成します。このペアは、Nostrリレーにおける",[491,5474,1211],{},"のアイデンティティとなります。",[930,5477,5479],{"className":1038,"code":5478,"language":1040,"meta":425,"style":425},"docker run --rm --entrypoint \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin ghcr.io\u002Fblock\u002Fbuzz:main generate-key\n\n# Use the generated Public Key\ndocker compose exec relay buzz-admin add-member --pubkey generated_Public_key\n",[491,5480,5481,5503,5507,5512],{"__ignoreMap":425},[938,5482,5483,5485,5488,5491,5494,5497,5500],{"class":940,"line":941},[938,5484,1181],{"class":1047},[938,5486,5487],{"class":1051}," run",[938,5489,5490],{"class":1051}," --rm",[938,5492,5493],{"class":1051}," --entrypoint",[938,5495,5496],{"class":1051}," \u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-admin",[938,5498,5499],{"class":1051}," ghcr.io\u002Fblock\u002Fbuzz:main",[938,5501,5502],{"class":1051}," generate-key\n",[938,5504,5505],{"class":940,"line":1067},[938,5506,1071],{"emptyLinePlaceholder":1070},[938,5508,5509],{"class":940,"line":1074},[938,5510,5511],{"class":1077},"# Use the generated Public Key\n",[938,5513,5514,5516,5518,5520,5522,5524,5526,5528],{"class":940,"line":1081},[938,5515,1181],{"class":1047},[938,5517,1184],{"class":1051},[938,5519,1187],{"class":1051},[938,5521,1190],{"class":1051},[938,5523,1193],{"class":1051},[938,5525,1196],{"class":1051},[938,5527,1199],{"class":1051},[938,5529,5530],{"class":1051}," generated_Public_key\n",[430,5532,5533],{},"CLIの設定を行います：",[930,5535,5537],{"className":1038,"code":5536,"language":1040,"meta":425,"style":425},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\necho 'export BUZZ_PRIVATE_KEY=\"nsec1...\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n\necho 'export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"'  >> \u002Fhome\u002F\u003Cuser>\u002F.bashrc\n",[491,5538,5539,5544,5575,5579],{"__ignoreMap":425},[938,5540,5541],{"class":940,"line":941},[938,5542,5543],{"class":1077},"# Copy the Secret key as the BUZZ_PRIVATE_KEY\n",[938,5545,5546,5548,5550,5553,5555,5558,5561,5564,5567,5570,5572],{"class":940,"line":1067},[938,5547,4416],{"class":970},[938,5549,5445],{"class":952},[938,5551,5552],{"class":1051},"export BUZZ_PRIVATE_KEY=\"nsec1...\"",[938,5554,5451],{"class":952},[938,5556,5557],{"class":952},"  >>",[938,5559,5560],{"class":1051}," \u002Fhome\u002F",[938,5562,5563],{"class":952},"\u003C",[938,5565,5566],{"class":1051},"use",[938,5568,5569],{"class":948},"r",[938,5571,1257],{"class":952},[938,5573,5574],{"class":1051},"\u002F.bashrc\n",[938,5576,5577],{"class":940,"line":1074},[938,5578,1071],{"emptyLinePlaceholder":1070},[938,5580,5581,5583,5585,5588,5590,5592,5594,5596,5598,5600,5602],{"class":940,"line":1081},[938,5582,4416],{"class":970},[938,5584,5445],{"class":952},[938,5586,5587],{"class":1051},"export BUZZ_RELAY_URL=\"wss:\u002F\u002Fbuzz.pafor.me\"",[938,5589,5451],{"class":952},[938,5591,5557],{"class":952},[938,5593,5560],{"class":1051},[938,5595,5563],{"class":952},[938,5597,5566],{"class":1051},[938,5599,5569],{"class":948},[938,5601,1257],{"class":952},[938,5603,5574],{"class":1051},[430,5605,5606,5607,5609],{},"以下のコマンドを実行して、",[491,5608,1211],{},"が正常に設定されているか確認します：",[930,5611,5613],{"className":1038,"code":5612,"language":1040,"meta":425,"style":425},"buzz channels list\n",[491,5614,5615],{"__ignoreMap":425},[938,5616,5617,5619,5621],{"class":940,"line":941},[938,5618,1237],{"class":1047},[938,5620,1240],{"class":1051},[938,5622,5623],{"class":1051}," list\n",[430,5625,5626],{},[433,5627],{"alt":5628,"src":5629},"アクティブなチャンネルを一覧表示してbuzz-cliの構成を確認するターミナルコマンド実行画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-cli-channels-list-terminal.webp",[2166,5631,5632],{"id":5632},"buzz-cliによるプロジェクト作成",[930,5634,5636],{"className":1038,"code":5635,"language":1040,"meta":425,"style":425},"# --channel refers to the UUID of the channel\nbuzz repos create --id TestKOA --name 'Display Name' --channel \"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b\"\n",[491,5637,5638,5643],{"__ignoreMap":425},[938,5639,5640],{"class":940,"line":941},[938,5641,5642],{"class":1077},"# --channel refers to the UUID of the channel\n",[938,5644,5645,5647,5650,5653,5656,5659,5662,5664,5667,5669,5671,5673,5676],{"class":940,"line":1067},[938,5646,1237],{"class":1047},[938,5648,5649],{"class":1051}," repos",[938,5651,5652],{"class":1051}," create",[938,5654,5655],{"class":1051}," --id",[938,5657,5658],{"class":1051}," TestKOA",[938,5660,5661],{"class":1051}," --name",[938,5663,5445],{"class":952},[938,5665,5666],{"class":1051},"Display Name",[938,5668,5451],{"class":952},[938,5670,1245],{"class":1051},[938,5672,3285],{"class":952},[938,5674,5675],{"class":1051},"bd92b3d1-8fac-441c-a9ac-2b2f3aac5c5b",[938,5677,1965],{"class":952},[430,5679,5680,5681,5683],{},"プロジェクトは作成者（オーナー）しか削除できません。",[491,5682,1211],{},"で作成された「Display Name」プロジェクトは、現在のCLIに削除コマンドが実装されていないため、この方法では削除できません。",[430,5685,5686],{},"Buzzデスクトップアプリに戻り、プロジェクトが作成されていることを確認します。",[430,5688,5689],{},[433,5690],{"alt":5691,"src":5692},"プロジェクトの正常な作成を確認するBuzzデスクトップアプリのプロジェクト画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-project-view.webp",[430,5694,5695],{},"リポジトリがProjectsビューに追加されると、それ以降はUI右上隅の「+」ボタンから簡単にリポジトリを追加できるようになります。",[430,5697,5698],{},[433,5699],{"alt":5700,"src":5701},"Buzzデスクトップクライアントのプラスアイコンを使用して新しい開発プロジェクトを追加する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-add-project-button.webp",[2166,5703,5705],{"id":5704},"既存のgitリポジトリの登録","既存のGitリポジトリの登録",[430,5707,5708,5709,5712,5713,5716,5717,5722],{},"Gitリポジトリが存在するマシンに",[491,5710,5711],{},"git-credential-nostr","をインストールします。これには",[448,5714,5715],{},"Git 2.46以上","とRustのビルド環境（toolchain）が必要です。詳細についてはこちらの",[441,5718,5721],{"href":5719,"rel":5720},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Ftree\u002Fmain\u002Fcrates\u002Fgit-credential-nostr",[445],"Readme","を参照してください。",[930,5724,5726],{"className":1038,"code":5725,"language":1040,"meta":425,"style":425},"cargo install --path crates\u002Fgit-credential-nostr\n",[491,5727,5728],{"__ignoreMap":425},[938,5729,5730,5732,5734,5736],{"class":940,"line":941},[938,5731,5430],{"class":1047},[938,5733,4490],{"class":1051},[938,5735,5435],{"class":1051},[938,5737,5738],{"class":1051}," crates\u002Fgit-credential-nostr\n",[430,5740,5741,5742,5744],{},"Buzzリレーでの認証用に",[491,5743,5711],{},"を設定します：",[930,5746,5748],{"className":1038,"code":5747,"language":1040,"meta":425,"style":425},"# 1. Register the helper and enable per-path credentials.\ngit config --global credential.helper nostr\ngit config --global credential.useHttpPath true\n\n# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\nmkdir -p ~\u002F.nostr\necho \"nsec1...\" > ~\u002F.nostr\u002Fkey && chmod 600 ~\u002F.nostr\u002Fkey\ngit config --global nostr.keyfile ~\u002F.nostr\u002Fkey\n",[491,5749,5750,5755,5771,5784,5788,5793,5802,5829],{"__ignoreMap":425},[938,5751,5752],{"class":940,"line":941},[938,5753,5754],{"class":1077},"# 1. Register the helper and enable per-path credentials.\n",[938,5756,5757,5759,5762,5765,5768],{"class":940,"line":1067},[938,5758,2794],{"class":1047},[938,5760,5761],{"class":1051}," config",[938,5763,5764],{"class":1051}," --global",[938,5766,5767],{"class":1051}," credential.helper",[938,5769,5770],{"class":1051}," nostr\n",[938,5772,5773,5775,5777,5779,5782],{"class":940,"line":1074},[938,5774,2794],{"class":1047},[938,5776,5761],{"class":1051},[938,5778,5764],{"class":1051},[938,5780,5781],{"class":1051}," credential.useHttpPath",[938,5783,1388],{"class":952},[938,5785,5786],{"class":940,"line":1081},[938,5787,1071],{"emptyLinePlaceholder":1070},[938,5789,5790],{"class":940,"line":1933},[938,5791,5792],{"class":1077},"# 2. Store your nsec in a key file (must be 0600). Replace \"nsec1...\" with your private key\n",[938,5794,5795,5797,5799],{"class":940,"line":1938},[938,5796,5180],{"class":1047},[938,5798,5183],{"class":1051},[938,5800,5801],{"class":1051}," ~\u002F.nostr\n",[938,5803,5804,5806,5808,5811,5813,5815,5818,5820,5823,5826],{"class":940,"line":1944},[938,5805,4416],{"class":970},[938,5807,3285],{"class":952},[938,5809,5810],{"class":1051},"nsec1...",[938,5812,3687],{"class":952},[938,5814,4450],{"class":952},[938,5816,5817],{"class":1051}," ~\u002F.nostr\u002Fkey",[938,5819,5460],{"class":952},[938,5821,5822],{"class":1047}," chmod",[938,5824,5825],{"class":2966}," 600",[938,5827,5828],{"class":1051}," ~\u002F.nostr\u002Fkey\n",[938,5830,5831,5833,5835,5837,5840],{"class":940,"line":2277},[938,5832,2794],{"class":1047},[938,5834,5761],{"class":1051},[938,5836,5764],{"class":1051},[938,5838,5839],{"class":1051}," nostr.keyfile",[938,5841,5828],{"class":1051},[430,5843,5844],{},"Buzzリレー上にリポジトリを作成します：",[930,5846,5849],{"className":5847,"code":5848,"language":4636},[4634],"buzz repos create --id koa-email-routing --name \"KOA Email Routing\" --clone \"https:\u002F\u002Fbuzz.pafor.me\u002Fgit\u002F\u003Cpub_key>\u002Fkoa-email-routing\" --nostr-relay \"wss:\u002F\u002Fbuzz.pafor.me\"\n",[491,5850,5848],{"__ignoreMap":425},[430,5852,5853,5854,5857,5858,5861],{},"最初の",[491,5855,5856],{},"git push","時に、",[491,5859,5860],{},"remote: missing Authorization header","（認証ヘッダー不足）のエラーが発生します。これを解決するには、リポジトリIDをBuzzのチャンネルに関連付ける（バインドする）必要があります。チャンネルのメンバーシップに基づいてGitの書き込み権限（ACL）が制御されるためです。",[930,5863,5865],{"className":1038,"code":5864,"language":1040,"meta":425,"style":425},"buzz repos bind --id koa-email-routing --channel \u003CCHANNEL_UUID>\n\n# push the code again\ngit push\n",[491,5866,5867,5892,5896,5901],{"__ignoreMap":425},[938,5868,5869,5871,5873,5876,5878,5881,5883,5885,5887,5889],{"class":940,"line":941},[938,5870,1237],{"class":1047},[938,5872,5649],{"class":1051},[938,5874,5875],{"class":1051}," bind",[938,5877,5655],{"class":1051},[938,5879,5880],{"class":1051}," koa-email-routing",[938,5882,1245],{"class":1051},[938,5884,1248],{"class":952},[938,5886,1251],{"class":1051},[938,5888,1254],{"class":948},[938,5890,5891],{"class":952},">\n",[938,5893,5894],{"class":940,"line":1067},[938,5895,1071],{"emptyLinePlaceholder":1070},[938,5897,5898],{"class":940,"line":1074},[938,5899,5900],{"class":1077},"# push the code again\n",[938,5902,5903,5905],{"class":940,"line":1081},[938,5904,2794],{"class":1047},[938,5906,5907],{"class":1051}," push\n",[430,5909,5910,5911,5913],{},"Buzzデスクトップアプリでプロジェクトを確認した際、以下のようにGitの読み込みに失敗する場合があります。これはデスクトップアプリが",[448,5912,5715],{},"を要求するためであり、アプリを直接起動した際に古いバージョンのGitが検出されていることが原因です。",[430,5915,5916],{},[433,5917],{"alt":5918,"src":5919},"ローカルのGitバージョンが2.46未満であるためにBuzzクライアントで発生したGit読み込みエラー画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-git-version-error.webp",[430,5921,5922,5923,5926,5927,5722],{},"シェルの設定ファイル等で、",[491,5924,5925],{},"launchctl setenv PATH \"\u002Fopt\u002Fhomebrew\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin:\u002Fusr\u002Fsbin:\u002Fsbin\"","のようにPATH環境変数をエクスポートし、シェル経由でBuzzアプリを起動してください。詳細についてはこちらの",[441,5928,5931],{"href":5929,"rel":5930},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz\u002Fissues\u002F5348",[445],"Issue",[930,5933,5935],{"className":1038,"code":5934,"language":1040,"meta":425,"style":425},"open -a Buzz\n",[491,5936,5937],{"__ignoreMap":425},[938,5938,5939,5942,5945],{"class":940,"line":941},[938,5940,5941],{"class":1047},"open",[938,5943,5944],{"class":1051}," -a",[938,5946,5947],{"class":1051}," Buzz\n",[430,5949,5950],{},"Buzzアプリで「Projects」を再度確認すると、無事にリポジトリの詳細が読み込まれているはずです。",[430,5952,5953],{},[433,5954],{"alt":5955,"src":5956},"Gitリポジトリの詳細とコミットログが正常に読み込まれたBuzzデスクトップ画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-repository-details-loaded.webp",[472,5958,5960],{"id":5959},"qrコードによるbuzzモバイルアプリとの同期","QRコードによるBuzzモバイルアプリとの同期",[430,5962,5963,5964,5967],{},"BuzzモバイルアプリとのペアリングはHTTPSプロトコルのみを受け付けます。また、VPS上ではデフォルトで",[491,5965,5966],{},"buzz-pair-relay","が起動していません。",[930,5969,5971],{"className":1038,"code":5970,"language":1040,"meta":425,"style":425},"cd ~\u002Fbuzz\ncargo install --path crates\u002Fbuzz-pair-relay\n",[491,5972,5973,5979],{"__ignoreMap":425},[938,5974,5975,5977],{"class":940,"line":941},[938,5976,2818],{"class":970},[938,5978,5425],{"class":1051},[938,5980,5981,5983,5985,5987],{"class":940,"line":1067},[938,5982,5430],{"class":1047},[938,5984,4490],{"class":1051},[938,5986,5435],{"class":1051},[938,5988,5989],{"class":1051}," crates\u002Fbuzz-pair-relay\n",[430,5991,5992,5993,5996,5997,5999],{},"以下を",[491,5994,5995],{},"compose.yml","に追加し、",[491,5998,5966],{},"サービスを定義します：",[930,6001,6003],{"className":1350,"code":6002,"language":1352,"meta":425,"style":425},"  pair:\n    image: ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n    entrypoint: [\"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay\"]\n    environment:\n      BUZZ_PAIR_RELAY_BIND_ADDR: 0.0.0.0:5000\n    ports:\n      - \"${BUZZ_PAIR_RELAY_PORT:-5000}:5000\"\n    restart: unless-stopped\n    networks:\n      [buzz-net]\n",[491,6004,6005,6012,6021,6041,6047,6057,6063,6074,6082,6088],{"__ignoreMap":425},[938,6006,6007,6010],{"class":940,"line":941},[938,6008,6009],{"class":1362},"  pair",[938,6011,1377],{"class":952},[938,6013,6014,6016,6018],{"class":940,"line":1067},[938,6015,3265],{"class":1362},[938,6017,1366],{"class":952},[938,6019,6020],{"class":1051}," ${BUZZ_IMAGE:-ghcr.io\u002Fblock\u002Fbuzz:main}\n",[938,6022,6023,6026,6028,6031,6033,6036,6038],{"class":940,"line":1074},[938,6024,6025],{"class":1362},"    entrypoint",[938,6027,1366],{"class":952},[938,6029,6030],{"class":952}," [",[938,6032,3687],{"class":952},[938,6034,6035],{"class":1051},"\u002Fusr\u002Flocal\u002Fbin\u002Fbuzz-pair-relay",[938,6037,3687],{"class":952},[938,6039,6040],{"class":952},"]\n",[938,6042,6043,6045],{"class":940,"line":1081},[938,6044,3295],{"class":1362},[938,6046,1377],{"class":952},[938,6048,6049,6052,6054],{"class":940,"line":1933},[938,6050,6051],{"class":1362},"      BUZZ_PAIR_RELAY_BIND_ADDR",[938,6053,1366],{"class":952},[938,6055,6056],{"class":1051}," 0.0.0.0:5000\n",[938,6058,6059,6061],{"class":940,"line":1938},[938,6060,3275],{"class":1362},[938,6062,1377],{"class":952},[938,6064,6065,6067,6069,6072],{"class":940,"line":1944},[938,6066,3282],{"class":952},[938,6068,3285],{"class":952},[938,6070,6071],{"class":1051},"${BUZZ_PAIR_RELAY_PORT:-5000}:5000",[938,6073,1965],{"class":952},[938,6075,6076,6078,6080],{"class":940,"line":2277},[938,6077,3356],{"class":1362},[938,6079,1366],{"class":952},[938,6081,3361],{"class":1051},[938,6083,6084,6086],{"class":940,"line":2288},[938,6085,5029],{"class":1362},[938,6087,1377],{"class":952},[938,6089,6090,6093,6096],{"class":940,"line":2384},[938,6091,6092],{"class":952},"      [",[938,6094,6095],{"class":1051},"buzz-net",[938,6097,6040],{"class":952},[430,6099,6100,6102,6103,571,6106,6109],{},[491,6101,2847],{},"ファイルに",[491,6104,6105],{},"BUZZ_PAIRING_RELAY_URL",[491,6107,6108],{},"BUZZ_PAIR_RELAY_PORT","を追記します：",[930,6111,6114],{"className":6112,"code":6113,"language":4636},[4634],"BUZZ_PAIRING_RELAY_URL=wss:\u002F\u002Fbuzz.pafor.me\u002Fpair\nBUZZ_PAIR_RELAY_PORT=5000\n",[491,6115,6113],{"__ignoreMap":425},[430,6117,6118,6119,6122],{},"Buzzデスクトップの「Settings」から「",[448,6120,6121],{},"Mobile","」を開きます：",[430,6124,6125],{},[433,6126],{"alt":6127,"src":6128},"モバイルデバイスの設定タブを表示するBuzzアプリの設定ダイアログ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-settings-mobile-tab.webp",[430,6130,6131],{},"「Start pairing」をクリックするとQRコードが生成されます。モバイルデバイスのBuzzアプリでこのQRコードをスキャンし、「Code Match」をクリックするとペアリングが完了します。",[430,6133,6134],{},[433,6135],{"alt":6136,"src":6137},"Buzzモバイルアプリとの同期用にデスクトップクライアントで安全なペアリングQRコードを生成する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-desktop-client-pairing-qr-code.webp",[430,6139,6140],{},"モバイルアプリ上のエージェントは、デスクトップアプリ側で対応するエージェントが稼働している場合のみ利用可能です。エージェントを動作させるには、デスクトップマシンを起動しておく必要があります。",[430,6142,6143],{},[433,6144],{"alt":6145,"src":6146},"同期されたアクティブなAIアシスタントエージェントを表示するBuzzモバイルアプリ画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf-Hosting%20Buzz%20As%20The%20Workspace%20Where%20AI%20Agents%20Become%20Colleagues\u002Fbuzz-mobile-app-active-agents.webp",[472,6148,6149],{"id":6149},"おわりに",[430,6151,6152],{},"BuzzはいくつかのバグやUIの制限があり、大規模な本番環境への導入には時期尚早ですが、少人数のチームや個人の開発者にとっては非常に刺激的なツールです。人間とAIが真に同僚として協働する、自律的な「AIネイティブ」な未来のワークスペースをいち早く体験することができます。",[472,6154,6155],{"id":6155},"参考資料",[481,6157,6158,6165,6172,6179],{},[484,6159,6160],{},[441,6161,6164],{"href":6162,"rel":6163},"https:\u002F\u002Fgithub.com\u002Fblock\u002Fbuzz",[445],"Buzz releases",[484,6166,6167],{},[441,6168,6171],{"href":6169,"rel":6170},"https:\u002F\u002Fblock.xyz\u002Finside\u002Fintroducing-buzz-where-humans-and-agents-work-together",[445],"Introducing Buzz",[484,6173,6174],{},[441,6175,6178],{"href":6176,"rel":6177},"https:\u002F\u002Fwww.hostinger.com\u002Ftutorials\u002Fwhat-is-buzz",[445],"What is buzz",[484,6180,6181],{},[441,6182,6185],{"href":6183,"rel":6184},"https:\u002F\u002Fmiget.com\u002Fblog\u002Fhow-to-self-host-buzz",[445],"How to self-host Buzz (Miget)",[1650,6187,6188],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":425,"searchDepth":1067,"depth":1074,"links":6190},[6191,6192,6193,6207,6216,6217,6218],{"id":4113,"depth":1067,"text":4114},{"id":4158,"depth":1067,"text":4159},{"id":4206,"depth":1067,"text":4207,"children":6194},[6195,6196,6200,6201,6202,6206],{"id":4210,"depth":1074,"text":4211},{"id":4239,"depth":1074,"text":4240,"children":6197},[6198,6199],{"id":4243,"depth":1081,"text":4244},{"id":4341,"depth":1081,"text":4342},{"id":4360,"depth":1074,"text":4361},{"id":4577,"depth":1074,"text":4578},{"id":4725,"depth":1074,"text":4726,"children":6203},[6204,6205],{"id":4729,"depth":1081,"text":4730},{"id":5106,"depth":1081,"text":5107},{"id":5169,"depth":1074,"text":5170},{"id":5212,"depth":1067,"text":5213,"children":6208},[6209,6210,6211],{"id":5290,"depth":1074,"text":5291},{"id":5335,"depth":1074,"text":5336},{"id":5372,"depth":1074,"text":5372,"children":6212},[6213,6214,6215],{"id":5394,"depth":1081,"text":5394},{"id":5632,"depth":1081,"text":5632},{"id":5704,"depth":1081,"text":5705},{"id":5959,"depth":1067,"text":5960},{"id":6149,"depth":1067,"text":6149},{"id":6155,"depth":1067,"text":6155},[1671,1670,1237],"2026-09-08",{"schemaOrg":6222,"robots":1704,"sitemap":6241},[6223,6224],{"@type":1681,"headline":453,"description":463,"image":464},{"@type":1683,"name":453,"description":463,"image":464,"step":6225},[6226,6229,6232,6235,6238],{"@type":1686,"name":6227,"text":6228},"フェーズ1：Cloudflareのセットアップ","Cloudflare APIトークンを作成し、DNS設定を構成します。",{"@type":1686,"name":6230,"text":6231},"フェーズ2：Dockerのインストール","Ubuntu VPSにDocker Engineをセットアップしてインストールします。",{"@type":1686,"name":6233,"text":6234},"フェーズ3：クローンと構成","リポジトリをクローンし、compose环境変数を構成します。",{"@type":1686,"name":6236,"text":6237},"フェーズ4：Caddyの統合","Cloudflare DNSチャレンジモジュールを使用してカスタムCaddyをビルドします。",{"@type":1686,"name":6239,"text":6240},"フェーズ5：自動バックアップ","PostgreSQLを自動的にバックアップするためのcronジョブを設定します。",{"lastmod":6242},"2026-09-03",{"title":6244,"description":463,"ogTitle":453,"ogDescription":463,"twitterTitle":453,"twitterDescription":463},"BlockのAI共有スペース「Buzz」をUbuntu VPSに自己ホストする方法","ja\u002Farticle\u002Fself-hosting-buzz-as-the-workspace-where-ai-agents-become-colleagues",[1711,6247,1108,6248,6249],"Docker","Caddy","Cloudflare","EE4T-Z1iblnIGKFh2wTTdhZWcCSPZKlWllLPKPhdosU",{"id":6252,"title":6253,"author":1713,"body":6254,"category":7961,"date":7963,"description":7964,"extension":1675,"image":7965,"imageAlt":7966,"isPublished":1070,"meta":7967,"minRead":4567,"navigation":1070,"path":193,"seo":7973,"stem":7974,"tags":7975,"updatedAt":6242,"__hash__":7978},"article\u002Fja\u002Farticle\u002Fself-hosted-travel-planner-trek.md","DockerとTREKで旅行プランをセルフホスト：日程、予約、旅費、持ち物リストを完全統合する究極のガイド",{"type":427,"value":6255,"toc":7920},[6256,6259,6262,6265,6269,6273,6415,6418,6424,6443,6446,6449,6553,6564,6567,6572,6575,6586,6590,6594,6597,6600,6633,6637,6640,6671,6674,6714,6717,6722,6730,6734,6741,6745,6748,6813,6817,6820,6824,6827,6831,6834,6842,6849,6853,6856,6859,6863,6867,6870,6874,6878,6881,6885,6889,6892,6897,6900,6905,6910,6914,6918,6921,6925,6930,6935,6938,6943,6947,6950,6955,6960,6963,6966,6970,6973,6976,6986,6989,6994,6997,7002,7006,7009,7014,7017,7022,7026,7029,7033,7038,7042,7045,7048,7053,7058,7063,7067,7074,7079,7084,7089,7094,7098,7103,7108,7111,7115,7118,7122,7128,7133,7138,7144,7149,7154,7159,7172,7176,7181,7202,7207,7210,7214,7217,7222,7225,7273,7277,7284,7287,7292,7297,7302,7307,7312,7318,7321,7326,7329,7334,7337,7341,7344,7349,7352,7356,7360,7363,7367,7370,7373,7377,7384,7388,7399,7401,7405,7409,7418,7421,7426,7429,7434,7437,7441,7444,7609,7612,7616,7619,7624,7627,7633,7637,7640,7644,7647,7652,7655,7660,7664,7671,7742,7754,7757,7762,7766,7770,7781,7857,7866,7869,7873,7877,7880,7882,7885,7888,7891,7894,7917],[430,6257,6258],{},"旅行計画の面倒なところは、航空券予約のPDF、ホテルの確認書、旅行仲間とのチャット履歴、訪れたい場所のリストなどが、あちこちに散らばってしまうことです。いざ合計支出を計算したり割り勘をしようとすると、膨大な旅行データの中からそれらを探し出すだけで大変な労力がかかります。",[430,6260,6261],{},"TREKは、セルフホスト可能なオープンソースの旅行プランナーであり、旅程、予約、予算、持ち物リストを一元管理できます。さらに、内蔵されているMCP（Model Context Protocol）サーバーを使用することで、AIエージェント（Claude Desktopなど）から旅行データを直接操作することが可能です。",[430,6263,6264],{},"本ガイドでは、デプロイ手順から、実際の旅行計画を最初から最後まで完全に管理する方法までをステップバイステップで詳しく解説します。",[885,6266,6268],{"id":6267},"_1-dockerを使用して旅行プランナーtrekをデプロイする方法","1. Dockerを使用して旅行プランナー「TREK」をデプロイする方法",[2166,6270,6272],{"id":6271},"ubuntu-vpsにdockerをインストールする","Ubuntu VPSにDockerをインストールする",[930,6274,6276],{"className":1038,"code":6275,"language":1040,"meta":425,"style":425},"# Add Docker's official GPG key and set up the Docker repository\ncurl -fsSL https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu\u002Fgpg | sudo gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg\n\n# Add the official Docker repository\necho \"deb [arch=amd64 signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fdocker-archive-keyring.gpg] https:\u002F\u002Fdownload.docker.com\u002Flinux\u002Fubuntu $(lsb_release -cs) stable\" | sudo tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fdocker.list > \u002Fdev\u002Fnull\n\n# Update package list\nsudo apt update\n\n# Install Docker Engine, Docker Community Edition, and containerd runtime\nsudo apt install docker-ce docker-ce-cli containerd.io -y\n\n# Verify docker is installed\ndocker --version\n\n# Starts automatically when your system boots\nsudo systemctl enable docker\n",[491,6277,6278,6282,6302,6306,6310,6342,6346,6350,6358,6362,6366,6382,6386,6390,6396,6400,6405],{"__ignoreMap":425},[938,6279,6280],{"class":940,"line":941},[938,6281,4374],{"class":1077},[938,6283,6284,6286,6288,6290,6292,6294,6296,6298,6300],{"class":940,"line":1067},[938,6285,2997],{"class":1047},[938,6287,4381],{"class":1051},[938,6289,4384],{"class":1051},[938,6291,4387],{"class":952},[938,6293,4390],{"class":1047},[938,6295,4393],{"class":1051},[938,6297,4396],{"class":1051},[938,6299,4399],{"class":1051},[938,6301,4402],{"class":1051},[938,6303,6304],{"class":940,"line":1074},[938,6305,1071],{"emptyLinePlaceholder":1070},[938,6307,6308],{"class":940,"line":1081},[938,6309,4411],{"class":1077},[938,6311,6312,6314,6316,6318,6320,6322,6324,6326,6328,6330,6332,6334,6336,6338,6340],{"class":940,"line":1933},[938,6313,4416],{"class":970},[938,6315,3285],{"class":952},[938,6317,4421],{"class":1051},[938,6319,4424],{"class":952},[938,6321,4427],{"class":1047},[938,6323,4430],{"class":1051},[938,6325,4433],{"class":952},[938,6327,4436],{"class":1051},[938,6329,3687],{"class":952},[938,6331,4387],{"class":952},[938,6333,4390],{"class":1047},[938,6335,3811],{"class":1051},[938,6337,4447],{"class":1051},[938,6339,4450],{"class":952},[938,6341,4453],{"class":1051},[938,6343,6344],{"class":940,"line":1938},[938,6345,1071],{"emptyLinePlaceholder":1070},[938,6347,6348],{"class":940,"line":1944},[938,6349,4462],{"class":1077},[938,6351,6352,6354,6356],{"class":940,"line":2277},[938,6353,1901],{"class":1047},[938,6355,4469],{"class":1051},[938,6357,4472],{"class":1051},[938,6359,6360],{"class":940,"line":2288},[938,6361,1071],{"emptyLinePlaceholder":1070},[938,6363,6364],{"class":940,"line":2384},[938,6365,4481],{"class":1077},[938,6367,6368,6370,6372,6374,6376,6378,6380],{"class":940,"line":2390},[938,6369,1901],{"class":1047},[938,6371,4469],{"class":1051},[938,6373,4490],{"class":1051},[938,6375,4493],{"class":1051},[938,6377,4496],{"class":1051},[938,6379,4499],{"class":1051},[938,6381,4502],{"class":1051},[938,6383,6384],{"class":940,"line":2396},[938,6385,1071],{"emptyLinePlaceholder":1070},[938,6387,6388],{"class":940,"line":2401},[938,6389,4531],{"class":1077},[938,6391,6392,6394],{"class":940,"line":2407},[938,6393,1181],{"class":1047},[938,6395,3610],{"class":1051},[938,6397,6398],{"class":940,"line":1706},[938,6399,1071],{"emptyLinePlaceholder":1070},[938,6401,6402],{"class":940,"line":3364},[938,6403,6404],{"class":1077},"# Starts automatically when your system boots\n",[938,6406,6407,6409,6411,6413],{"class":940,"line":3369},[938,6408,1901],{"class":1047},[938,6410,1904],{"class":1051},[938,6412,2030],{"class":1051},[938,6414,4522],{"class":1051},[2166,6416,6417],{"id":6417},"暗号化キーの生成",[430,6419,6420,6421,6423],{},"TREKは機密データの暗号化にキーを使用します。以下のコマンドまたはこちらの",[441,6422,4662],{"href":2868},"を使用して、暗号化キーを生成してください：",[930,6425,6427],{"className":1038,"code":6426,"language":1040,"meta":425,"style":425},"openssl rand -hex 32\n",[491,6428,6429],{"__ignoreMap":425},[938,6430,6431,6434,6437,6440],{"class":940,"line":941},[938,6432,6433],{"class":1047},"openssl",[938,6435,6436],{"class":1051}," rand",[938,6438,6439],{"class":1051}," -hex",[938,6441,6442],{"class":2966}," 32\n",[430,6444,6445],{},"生成したキーは安全な場所に保管してください。キーを紛失すると、暗号化されたデータへのアクセス手段が失われます。",[2166,6447,6448],{"id":6448},"コンテナの起動",[930,6450,6452],{"className":1038,"code":6451,"language":1040,"meta":425,"style":425},"docker run -d \\\n  --name trek \\\n  -p 3000:3000 \\\n  -e ENCRYPTION_KEY=\"\u003Cgenerated_key>\" \\\n  -e APP_URL=\"https:\u002F\u002Ftrek.pafor.me\" \\\n  -v .\u002Fdata:\u002Fapp\u002Fdata \\\n  -v .\u002Fuploads:\u002Fapp\u002Fuploads \\\n  --restart unless-stopped \\\n  mauriceboe\u002Ftrek:latest\n",[491,6453,6454,6466,6476,6486,6503,6519,6529,6538,6548],{"__ignoreMap":425},[938,6455,6456,6458,6460,6463],{"class":940,"line":941},[938,6457,1181],{"class":1047},[938,6459,5487],{"class":1051},[938,6461,6462],{"class":1051}," -d",[938,6464,6465],{"class":948}," \\\n",[938,6467,6468,6471,6474],{"class":940,"line":1067},[938,6469,6470],{"class":1051},"  --name",[938,6472,6473],{"class":1051}," trek",[938,6475,6465],{"class":948},[938,6477,6478,6481,6484],{"class":940,"line":1074},[938,6479,6480],{"class":1051},"  -p",[938,6482,6483],{"class":1051}," 3000:3000",[938,6485,6465],{"class":948},[938,6487,6488,6491,6494,6496,6499,6501],{"class":940,"line":1081},[938,6489,6490],{"class":1051},"  -e",[938,6492,6493],{"class":1051}," ENCRYPTION_KEY=",[938,6495,3687],{"class":952},[938,6497,6498],{"class":1051},"\u003Cgenerated_key>",[938,6500,3687],{"class":952},[938,6502,6465],{"class":948},[938,6504,6505,6507,6510,6512,6515,6517],{"class":940,"line":1933},[938,6506,6490],{"class":1051},[938,6508,6509],{"class":1051}," APP_URL=",[938,6511,3687],{"class":952},[938,6513,6514],{"class":1051},"https:\u002F\u002Ftrek.pafor.me",[938,6516,3687],{"class":952},[938,6518,6465],{"class":948},[938,6520,6521,6524,6527],{"class":940,"line":1938},[938,6522,6523],{"class":1051},"  -v",[938,6525,6526],{"class":1051}," .\u002Fdata:\u002Fapp\u002Fdata",[938,6528,6465],{"class":948},[938,6530,6531,6533,6536],{"class":940,"line":1944},[938,6532,6523],{"class":1051},[938,6534,6535],{"class":1051}," .\u002Fuploads:\u002Fapp\u002Fuploads",[938,6537,6465],{"class":948},[938,6539,6540,6543,6546],{"class":940,"line":2277},[938,6541,6542],{"class":1051},"  --restart",[938,6544,6545],{"class":1051}," unless-stopped",[938,6547,6465],{"class":948},[938,6549,6550],{"class":940,"line":2288},[938,6551,6552],{"class":1051},"  mauriceboe\u002Ftrek:latest\n",[481,6554,6555],{},[484,6556,6557,6563],{},[448,6558,6559,6562],{},[491,6560,6561],{},"APP_URL","を正しく設定する必要があります"," — MCPサーバーのOAuthディスカバリーフローは、このURLに依存しています。デプロイの初期段階から、最終的な公開HTTPSアドレスを設定してください。",[430,6565,6566],{},"初回起動時はイメージのプルに少し時間がかかります：",[433,6568],{"src":6569,"alt":6570,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-pull-image.webp","TREKのDocker pullおよびrunのログ","max-width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6573,6574],{},"起動状態を確認します：",[930,6576,6578],{"className":1038,"code":6577,"language":1040,"meta":425,"style":425},"docker ps\n",[491,6579,6580],{"__ignoreMap":425},[938,6581,6582,6584],{"class":940,"line":941},[938,6583,1181],{"class":1047},[938,6585,5150],{"class":1051},[433,6587],{"src":6588,"alt":6589,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-docker-ps-status.webp","docker psによる起動中コンテナのステータス確認",[885,6591,6593],{"id":6592},"_2-caddyリバースプロキシによるドメインルーティングとsslの設定","2. CaddyリバースプロキシによるドメインルーティングとSSLの設定",[430,6595,6596],{},"パスキーやMCP用のOAuthを利用するには、HTTPSの導入が必須です。ドメインは、無料のSSL証明書とDDoS保護機能を提供するCloudflareでホストされています。",[430,6598,6599],{},"ポート3000を指すセキュアなリバースプロキシサーバーとして、Caddyをセットアップします。Caddyfileの記述例は以下の通りです：",[930,6601,6603],{"className":2912,"code":6602,"language":2914,"meta":425,"style":425},"{$TREK_DOMAIN} {\n  encode zstd gzip\n  reverse_proxy host.docker.internal:3000\n}\n",[491,6604,6605,6616,6620,6629],{"__ignoreMap":425},[938,6606,6607,6609,6612,6614],{"class":940,"line":941},[938,6608,2942],{"class":952},[938,6610,6611],{"class":948},"$TREK_DOMAIN",[938,6613,2948],{"class":952},[938,6615,2951],{"class":952},[938,6617,6618],{"class":940,"line":1067},[938,6619,2956],{"class":948},[938,6621,6622,6624,6626],{"class":940,"line":1074},[938,6623,2961],{"class":948},[938,6625,1366],{"class":952},[938,6627,6628],{"class":2966},"3000\n",[938,6630,6631],{"class":940,"line":1081},[938,6632,2929],{"class":952},[885,6634,6636],{"id":6635},"_3-初期設定と管理者アカウントのセキュアなセットアップ","3. 初期設定と管理者アカウントのセキュアなセットアップ",[430,6638,6639],{},"管理者アカウントを作成する方法は2つあります：",[481,6641,6642,6652],{},[484,6643,6644,6645,1730,6648,6651],{},"**環境変数",[491,6646,6647],{},"ADMIN_EMAIL",[491,6649,6650],{},"ADMIN_PASSWORD","**を直接指定して、その値でアカウントを作成する。",[484,6653,6654,6655,6658,6659,6662,6663,6666,6667,6670],{},"TREKが自動でメールアドレス",[491,6656,6657],{},"admin@trek.local","、ユーザー名",[491,6660,6661],{},"admin","を作成し、",[448,6664,6665],{},"コンテナログにランダム生成されたパスワードを出力する","。",[491,6668,6669],{},"docker logs trek","を実行してパスワードを確認します。",[430,6672,6673],{},"もしログからパスワードが見つからない場合は、以下のコマンドでリセットしてください：",[930,6675,6677],{"className":1038,"code":6676,"language":1040,"meta":425,"style":425},"docker exec -it -e RESET_ADMIN_EMAIL=admin@trek.local -e RESET_ADMIN_PASSWORD='YourNewPassword' trek node server\u002Freset-admin.js\n",[491,6678,6679],{"__ignoreMap":425},[938,6680,6681,6683,6685,6688,6691,6694,6696,6699,6701,6704,6706,6708,6711],{"class":940,"line":941},[938,6682,1181],{"class":1047},[938,6684,1187],{"class":1051},[938,6686,6687],{"class":1051}," -it",[938,6689,6690],{"class":1051}," -e",[938,6692,6693],{"class":1051}," RESET_ADMIN_EMAIL=admin@trek.local",[938,6695,6690],{"class":1051},[938,6697,6698],{"class":1051}," RESET_ADMIN_PASSWORD=",[938,6700,5451],{"class":952},[938,6702,6703],{"class":1051},"YourNewPassword",[938,6705,5451],{"class":952},[938,6707,6473],{"class":1051},[938,6709,6710],{"class":1051}," node",[938,6712,6713],{"class":1051}," server\u002Freset-admin.js\n",[430,6715,6716],{},"初回のログイン時にパスワードの変更を求められます。",[433,6718],{"src":6719,"alt":6720,"style":6721},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-initial-login-password-prompt.webp","初期ログインおよび管理者パスワードのリセット画面","max-width: 215px; width:100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6723,6724,6725],{},"Admin（管理）をクリックし、メールアドレスを更新します：",[433,6726],{"src":6727,"alt":6728,"style":6729},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-email-update-panel.webp","TREK管理者設定でのカスタムメールのセットアップ","max-width: 700px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2166,6731,6733],{"id":6732},"_31-バックアップ","3.1 バックアップ",[430,6735,6736,6737],{},"管理画面で保存期間ポリシーを設定し、自動バックアップを有効にします：\n",[433,6738],{"src":6739,"alt":6740,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-admin-backup-retention-policy.webp","自動バックアップスケジュールと保持ルールの設定",[2166,6742,6744],{"id":6743},"_32-アップロードされたファイルをcloudflare-r2に保存する","3.2 アップロードされたファイルをCloudflare R2に保存する",[430,6746,6747],{},"アップロードしたファイルや写真、バックアップをCloudflare R2に格納することで、VPSのディスク領域をクリーンかつ軽量に保てます。TREKはS3互換のバックエンドをサポートしており、Cloudflare R2はこれに完璧に適合します。",[529,6749,6750,6756,6765,6773,6781,6789,6797,6805],{},[484,6751,1120,6752,6755],{},[491,6753,6754],{},"trek","」という名前のR2バケットを作成します。",[484,6757,6758,6759,6760],{},"Account Details（アカウント詳細）セクションで、あなたのアカウントIDを確認します：","\n  ",[433,6761],{"src":6762,"alt":6763,"style":6764},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-account-details-id.webp","CloudflareポータルでのアカウントID of TREKの確認","max-width: 325px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[484,6766,6767,6759,6768],{},"Manage API Tokens（APIトークンの管理）をクリックします：",[433,6769],{"src":6770,"alt":6771,"style":6772},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-manage-api-tokens-button.webp","CloudflareポータルのAPIトークン管理画面","max-width: 282px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[484,6774,6775,6759,6776],{},"バケットに対する読み取り\u002F書き込み権限を持つCreate Account API token（アカウントAPIトークンの作成）をクリックします：",[433,6777],{"src":6778,"alt":6779,"style":6780},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-r2-create-token-permissions.webp","読み取り\u002F書き込み権限を持つR2アクセストークンの作成","max-width: 360px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[484,6782,6783,6759,6784],{},"管理画面のADMINISTRATION（管理）パネルでStorage（ストレージ）をクリックします：",[433,6785],{"src":6786,"alt":6787,"style":6788},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-administration-storage-menu.webp","TREK管理パネルでのストレージ設定への移動","max-width: 539px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[484,6790,6791,6759,6792],{},"Add Backend（バックエンドの追加）ボタンをクリックし、エンドポイント、バケット名、クレデンシャル情報を入力します：",[433,6793],{"src":6794,"alt":6795,"style":6796},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-storage-backend-credentials.webp","S3互換のCloudflare R2ストレージバックエンドの設定","max-width: 445px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[484,6798,6799,6759,6800],{},"Apply（適用）をクリックした後、Test（テスト）のリンクボタンをクリックします。「Connection OK」と表示されることを確認してください：",[433,6801],{"src":6802,"alt":6803,"style":6804},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-test-storage-backend-connection-ok.webp","Connection OKと表示されたストレージ接続テストの成功","max-width: 677px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[484,6806,6807,6759,6808],{},"すべてのストレージカテゴリをCloudflare R2に切り替え、Save changes（変更を保存）をクリックします：",[433,6809],{"src":6810,"alt":6811,"style":6812},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-switch-storage-categories-r2.webp","すべてのファイルストレージカテゴリをCloudflare R2にルーティング","max-width: 653px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2166,6814,6816],{"id":6815},"_33-パスキーログイン","3.3 パスキーログイン",[430,6818,6819],{},"TREKはパスキー、2要素認証（2FA）、およびOIDCによるシングルサインオンをサポートしています。パスキーを有効にするには、設定画面でドメイン名と許可されたオリジン（Allowed Origins）を入力し、Save（保存）をクリックします：",[433,6821],{"src":6822,"alt":6823,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-passkey-allowed-origins-settings.webp","安全なパスキー認証のための許可されたオリジンの登録",[430,6825,6826],{},"許可されたオリジンを正しく設定しないと、パスキーの登録が失敗します。",[2166,6828,6830],{"id":6829},"_34-google-maps-apiキー","3.4 Google Maps APIキー",[430,6832,6833],{},"Google MapsのAPIキーを登録すると、場所の検索時に評価、営業時間、写真などの情報が自動的に追加されます。キーを登録しない場合、TREKは自動的にOpenStreetMapを使用します（その場合、評価や写真は表示されません）。",[430,6835,6836,6837],{},"こちらのリンクからGet demo keyをクリックしてキーを取得します：                                                  ",[433,6838],{"src":6839,"alt":6840,"style":6841},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgoogle-maps-get-demo-api-key.webp","Google Maps PlatformのAPIキーの取得リクエスト","max-width: 176px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6843,6844,6845],{},"キーを設定画面に貼り付け、Test（テスト）をクリックして接続を確認します：\n",[433,6846],{"src":6847,"alt":6848,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-key-test-connection.webp","設定画面でのGoogle Maps APIキーの接続検証",[2166,6850,6852],{"id":6851},"_35-ai統合","3.5 AI統合",[430,6854,6855],{},"AIモデルは、予約確認メールやPDFを解析し、構造化された予約データに変換するために使用されます。",[430,6857,6858],{},"左メニューのAddons（アドオン）をクリックし、AI Parsingを有効にします。「OpenAI」（またはその他の互換プロバイダー）を選択し、プロバイダーの詳細情報を入力します：",[433,6860],{"src":6861,"alt":6862,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-ai-parsing-openai.webp","OpenAI連携によるAI解析アドオンの有効化",[2166,6864,6866],{"id":6865},"_36-mcpアクセス","3.6 MCPアクセス",[430,6868,6869],{},"Addons（アドオン）の配下で、MCPを有効にします：",[433,6871],{"src":6872,"alt":6873,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-addons-enable-mcp.webp","Model Context Protocol MCPサーバーアドオンの有効化",[2166,6875,6877],{"id":6876},"_37-プラグイン","3.7 プラグイン",[430,6879,6880],{},"以下の推奨プラグインを有効にすることをお勧めします：",[433,6882],{"src":6883,"alt":6884,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-recommended-addons-plugins-activation.webp","有効化された推奨プラグインおよびアドオンの一覧",[2166,6886,6888],{"id":6887},"_38-普段使い用ユーザーの作成","3.8 普段使い用ユーザーの作成",[430,6890,6891],{},"旅行計画は、管理者アカウントではなく一般ユーザーアカウントで行うのが基本です。通常のユーザーを作成し、そちらでログインし直します：",[433,6893],{"src":6894,"alt":6895,"style":6896},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-regular-user-form.webp","TREKパネルでの一般ユーザーアカウント of TREKの作成","max-width: 420px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6898,6899],{},"ログインしたら、パスキーを追加するか、2要素認証（2FA）を設定してセキュリティを強化しましょう：",[433,6901],{"src":6902,"alt":6903,"style":6904},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-user-security-passkey-2fa-setup.webp","パスキーと2要素認証によるユーザーセキュリティ設定","max-width: 381px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[481,6906,6907],{},[484,6908,6909],{},"Add a passkeyをクリックし、現在のパスワードを入力して認証します：",[433,6911],{"src":6912,"alt":6913,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-passkey-confirm-password.webp","新しいハードウェアパスキーの登録用パスワード確認",[885,6915,6917],{"id":6916},"_4-デプロイのテスト過去の旅行データのインポート","4. デプロイのテスト：過去の旅行データのインポート",[430,6919,6920],{},"TREKを使いこなすには、過去の旅行データを登録してみるのが一番の近道です。",[2166,6922,6924],{"id":6923},"_41-旅行プランの作成","4.1 旅行プランの作成",[481,6926,6927],{},[484,6928,6929],{},"New Tripをクリックし、旅行の実際の過去の期間に合わせてStart Date（開始日）とEnd Date（終了日）を設定します：",[433,6931],{"src":6932,"alt":6933,"style":6934},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-trip-details.webp","カスタム日付範囲での新規旅行の作成","max-width: 334px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6936,6937],{},"カバー画像をアップロード（ドラッグ＆ドロップ、またはクリップボードから貼り付け）し、Create New Tripをクリックします：",[433,6939],{"src":6940,"alt":6941,"style":6942},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-cover-image-upload.webp","高品質な旅行カバー画像のアップロード設定","max-width: 608px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2166,6944,6946],{"id":6945},"_42-予約情報のインポート","4.2 予約情報のインポート",[430,6948,6949],{},"飛行機、電車、その他の交通機関の予約確認書などのファイルをここにドロップします：",[433,6951],{"src":6952,"alt":6953,"style":6954},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-travel-booking-files.webp","旅行のPDFや予約確認書をインポートするドラッグ＆ドロップエリア","max-width: 570px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,6956],{"src":6957,"alt":6958,"style":6959},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-import-booking-pdf-processing-status.webp","アップロードされた予約のデータ抽出処理ウィンドウ","max-width: 377px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6961,6962],{},"AIモデルが有効になっていると、予約確認書のPDFが解析され、構造化された予約データが抽出されます。",[430,6964,6965],{},"抽出された結果を確認し、Add（追加）をクリックして予約詳細を確定します：",[433,6967],{"src":6968,"alt":6969,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-review-parsed-booking-details.webp","AIによって抽出された構造化された予約情報の確認",[430,6971,6972],{},"予約情報がメール本文にしかない場合は、メールをPDFとして書き出してアップロードすれば、同様に自動抽出パイプラインが適用されます。",[430,6974,6975],{},"以下のスクリーンショットは、インポートされた予約情報の表示例です：",[430,6977,6978,6982],{},[433,6979],{"src":6980,"alt":6981,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-bookings-timeline-view.webp","旅行予約の包括的なタイムライン表示",[433,6983],{"src":6984,"alt":6985,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-booking-confirmation-details.webp","確認済みの交通機関予約の詳細表示",[430,6987,6988],{},"Plan（計画）ページでは、すべての宿泊施設が地図上に表示されます：",[433,6990],{"src":6991,"alt":6992,"style":6993},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-plan-accommodations-map-display.webp","すべての宿泊施設をプロットしたインタラクティブマップ","max-width: 546px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,6995,6996],{},"トップメニューのAtlasをクリックすると、これまでに訪れた国のリストと地図が表示されます：",[433,6998],{"src":6999,"alt":7000,"style":7001},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-atlas-countries-visited-summary.webp","個人アトラストラッカーにおける旅行履歴の概要","max-width: 407px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2166,7003,7005],{"id":7004},"_43-同行者の追加","4.3 同行者の追加",[430,7007,7008],{},"Share（共有）ボタンをクリックします：",[433,7010],{"src":7011,"alt":7012,"style":7013},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-share-options-button.webp","TREKでの旅行共有ダイアログの表示","max-width: 224px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7015,7016],{},"ダイアログの下部でゲストを追加できます：",[433,7018],{"src":7019,"alt":7020,"style":7021},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-add-companions-guests.webp","カスタムの同行者やゲストの追加設定","max-width: 635px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2166,7023,7025],{"id":7024},"_44-経費の記録","4.4 経費の記録",[430,7027,7028],{},"海外旅行保険、現地交通費、SIMカード代など、予約確認書以外の支出を記録するには、Add expense（経費を追加）をクリックします：",[433,7030],{"src":7031,"alt":7032,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-custom-expense-form.webp","経費入力フォームへの詳細な出費データの入力",[433,7034],{"src":7035,"alt":7036,"style":7037},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-expenses-list-billing-split.webp","割り勘の内訳と経费追跡台帳","max-width: 526px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2166,7039,7041],{"id":7040},"_45-旅行セグメント行程の分割","4.5 旅行セグメント（行程の分割）",[430,7043,7044],{},"この機能を使用するには、「Trip Segment」プラグインがインストールされている必要があります。",[430,7046,7047],{},"長期の旅行をいくつかのセグメントに分割することで、各期間の予約、訪れる場所、経費が整理され、見やすくなります：",[433,7049],{"src":7050,"alt":7051,"style":7052},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-overview-display.webp","複雑な旅程をいくつかの旅行セグメントに分割","max-width: 465px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7054],{"src":7055,"alt":7056,"style":7057},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segment-itinerary-details.webp","スポットやスケジュールを表示中の有効な旅行セグメント","max-width: 596px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7059],{"src":7060,"alt":7061,"style":7062},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-trip-segments-interactive-map.webp","タイムライン上に個別の旅行レグをマッピング","max-width: 605px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2166,7064,7066],{"id":7065},"_46-ジャーニーの作成とアトラスの確認","4.6 ジャーニーの作成とアトラスの確認",[430,7068,7069,7070,7073],{},"複数の旅行を「",[448,7071,7072],{},"Journey","（ジャーニー）」としてまとめ、ストーリーを書いて友人たちに冒険を共有できます：",[433,7075],{"src":7076,"alt":7077,"style":7078},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-create-new-journey-group.webp","複数の旅行を1つのビジュアルジャーニーに統合","max-width: 441px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7080],{"src":7081,"alt":7082,"style":7083},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-timeline-story-writing.webp","ジャーニーパネルでのビジュアルストーリーの作成","max-width: 443px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7085],{"src":7086,"alt":7087,"style":7088},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-gallery-media-grid.webp","ジャーニー内のメディアコレクションとギャラリーグリッド","max-width: 440px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7090],{"src":7091,"alt":7092,"style":7093},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-journey-public-share-link.webp","共同編集用ジャーニーの公開共有リンク生成","max-width: 532px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[885,7095,7097],{"id":7096},"_5-カスタム旅程と持ち物リストの設計","5. カスタム旅程と持ち物リストの設計",[481,7099,7100],{},[484,7101,7102],{},"New Tripをクリックし、旅行名と日程を入力します：",[433,7104],{"src":7105,"alt":7106,"style":7107},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-planning-new-trip-setup.webp","日付なし旅行を作成する初期プロンプトダイアログ","max-width: 432px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7109,7110],{},"**日程がまだ未定の場合は、日付欄を空欄のままにしてください。**代わりに「日数（最大365日）」を指定するフィールドが表示されます。まずは計画を立て、日程は後から決定することができます。",[2166,7112,7114],{"id":7113},"_51-場所スポットの追加","5.1 場所（スポット）の追加",[430,7116,7117],{},"旅行計画の中で最も時間がかかるのがスポットの追加ですが、TREKにはいくつかの効率的な方法が用意されています：",[433,7119],{"src":7120,"alt":7121,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-add-places-methods-overview.webp","旅程に新しいスポットを追加するマルチチャネル方式の概要",[430,7123,7124,7127],{},[448,7125,7126],{},"1. 地図上を右クリック","して、その地点に直接スポットを作成する。住所は自動的に逆ジオコーディング（住所の自動取得）されます：",[433,7129],{"src":7130,"alt":7131,"style":7132},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-map-location.webp","地図インターフェースを右クリックして場所をピンポイントで指定","max-width: 632px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7134],{"src":7135,"alt":7136,"style":7137},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-right-click-reverse-geocode-address.webp","選択した地図座標の自動リバースジオコーディング","max-width: 628px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7139,7140,7143],{},[448,7141,7142],{},"2. + Add Place\u002FActivity","をクリックして、名称で検索する",[433,7145],{"src":7146,"alt":7147,"style":7148},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-search-place-by-name-input.webp","テキスト入力による実際のスポットの検索","max-width: 642px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7150],{"src":7151,"alt":7152,"style":7153},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-select-place-search-results-list.webp","住所情報付きでのスポット検索結果の一覧表示","max-width: 594px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7155],{"src":7156,"alt":7157,"style":7158},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-place-details-rich-info-card.webp","クチコミと評価付きの包括的なスポット詳細カード","max-width: 568px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7160,7161,506,7164,7167,7168,7171],{},[448,7162,7163],{},"3. Googleマップの共有URL",[491,7165,7166],{},"maps.app.goo.gl\u002F…"," または ",[491,7169,7170],{},"maps.google.com\u002F…","）を検索窓に貼り付ける。TREKがスポット名、住所、座標を自動で解析・抽出します：",[433,7173],{"src":7174,"alt":7175,"style":6804},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-paste-google-maps-share-link.webp","貼り付けられたGoogleマップの共有リンクから場所を直接解析",[433,7177],{"src":7178,"alt":7179,"style":7180},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-google-maps-parsed-location.webp","GoogleマップのURLからの座標抽出に成功","max-width: 543px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7182,7183,7186,7187,506,7190,7193,7194,7197,7198,7201],{},[448,7184,7185],{},"4. 一括インポート"," — これが最も簡単な方法です。Googleマップでお気に入りのリスト（「行きたい場所」など）を作成している場合、それを",[491,7188,7189],{},".gpx",[491,7191,7192],{},".kml","や",[491,7195,7196],{},".kmz","も対応）としてエクスポートし、右側パネル of ",[448,7199,7200],{},"Import file","をクリックしてアップロードすれば、すべての場所を一度にインポートできます：",[433,7203],{"src":7204,"alt":7205,"style":7206},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-bulk-import-places-gpx-file.webp","GPXまたはKMLファイルを使用したスポットの一括インポート","max-width: 389px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7208,7209],{},"日程に収まるかどうかを気にする必要はありません。まずは興味のある場所をすべて追加し、日程への割り当ては後から行います。",[2166,7211,7213],{"id":7212},"_52-日ごとの計画とメモ","5.2 日ごとの計画とメモ",[430,7215,7216],{},"「Day Plan」では、スポットを日ごとに整理し、訪問順を設定できます。折りたたみ可能な日別のリストになっており、すべてドラッグ＆ドロップで操作可能です：",[433,7218],{"src":7219,"alt":7220,"style":7221},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-drag-drop-ordering.webp","ドラッグ＆ドロップによる日々のルート順序のカスタマイズ","max-width: 496px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7223,7224],{},"以下の便利な詳細機能が備わっています：",[481,7226,7227,7237,7247,7257],{},[484,7228,7229,7232,7233],{},[448,7230,7231],{},"スポット間の移動手段",": 日次プランの左上にあるバスのアイコンをクリックすると、その日の移動手段（電車、バス、フライトなど）を追加できます：\n",[433,7234],{"src":7235,"alt":7236,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-commuting-transport-button.webp","日中のセグメント間を繋ぐ交通手段の登録",[484,7238,7239,7242,7243],{},[448,7240,7241],{},"デイメモ（日ごとのメモ）",": 日次プランの左下にあるノートのアイコンから、アイコン付きのメモを添付できます（例：「今日は早めに出発する」「この美術館は要予約」）：\n",[433,7244],{"src":7245,"alt":7246,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-icon-tagged-notes-button.webp","見やすいアイコン付きカスタムメモを日毎に追加",[484,7248,7249,7252,7253],{},[448,7250,7251],{},"タイムスロットの設定",": 右側のパネルから場所をドラッグして日付にドロップし、時間を割り当てます。時間が設定された場所は、地図上で自動的に経路接続されます：\n",[433,7254],{"src":7255,"alt":7256,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-day-plan-timed-places-routing.webp","時間設定されたスポット間の自動計算ルート表示",[484,7258,7259,7260,7263,7264,7267,7268,5722],{},"ルートの最適化（",[448,7261,7262],{},"Route optimisation","）および天気（",[448,7265,7266],{},"Weather","）については、",[441,7269,7272],{"href":7270,"rel":7271},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FDay-Plans-and-Notes",[445],"Day Plans and NotesのWikiページ",[2166,7274,7276],{"id":7275},"_53-コレクション再利用可能なスポットリスト","5.3 コレクション：再利用可能なスポットリスト",[430,7278,7279,7280,7283],{},"コレクション機能を使用すると、特定の旅行とは無関係に、お気に入りのスポットリストを保存・管理できます。友人と共有したり、次回の旅行にそのまま活用したりできます。スポットは旅行プランに",[448,7281,7282],{},"コピー","されるため、旅行内の情報を編集しても元のコレクションには影響しません（その逆も同様です）。",[430,7285,7286],{},"上部メニューのCollections（コレクション）をクリックします：",[433,7288],{"src":7289,"alt":7290,"style":7291},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-dashboard-view.webp","保存済みスポットのカスタムコレクション画面","max-width: 495px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[481,7293,7294],{},[484,7295,7296],{},"New listをクリックして、新しいリストを作成します：",[433,7298],{"src":7299,"alt":7300,"style":7301},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-create-new-list.webp","ユーザーコレクション内でのカスタムリストの作成","max-width: 269px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[481,7303,7304],{},[484,7305,7306],{},"Add a placeをクリックし、詳細を入力します：",[433,7308],{"src":7309,"alt":7310,"style":7311},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-add-place-manually-form.webp","カスタムコレクションリストへスポットを手動で追加するフォーム","max-width: 271px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7313,7314,7317],{},[448,7315,7316],{},"注意:"," 「Add a place」ダイアログ内の検索機能は、うまく機能しない場合があるため、その際は詳細を手動で入力する必要があります。",[430,7319,7320],{},"場所のジオ座標が利用可能な場合、それらは地図上に表示されます：",[433,7322],{"src":7323,"alt":7324,"style":7325},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-map-places-display.webp","インタラクティブマップ上でのカスタムコレクションスポットの可視化","max-width: 592px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7327,7328],{},"スポットをラベルで整理するには、チェックボックスのアイコンをクリックします：",[433,7330],{"src":7331,"alt":7332,"style":7333},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-select-places-tickbox.webp","保存済みスポットの一括ラベル付け用の選択モード","max-width: 662px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7335,7336],{},"グループ化したいスポットを選択し、Assign label（ラベルを割り当て）をクリックします：",[433,7338],{"src":7339,"alt":7340,"style":7180},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-group-assign-label.webp","選択したコレクションスポットへの説明ラベルの割り当て",[430,7342,7343],{},"事前にラベルを作成するには、Manage labels（ラベルの管理）をクリックします：",[433,7345],{"src":7346,"alt":7347,"style":7348},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-manage-custom-labels.webp","カスタムラベル의作成と管理","max-width: 411px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7350,7351],{},"ラベルを選択して、Assign labelをクリックします：",[433,7353],{"src":7354,"alt":7355,"style":7001},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-collections-confirm-label-selection.webp","グループスポットへのカスタムラベルの適用",[2166,7357,7359],{"id":7358},"_54-費用と予算","5.4 費用と予算",[430,7361,7362],{},"旅行中のその他の費用は、「Costs」（費用）ページから追加できます。",[433,7364],{"src":7365,"alt":7366,"style":7221},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-budget-overall-expenses-list.webp","包括的な経費一覧表とバランス清算台帳",[430,7368,7369],{},"同じページで、同行者が支払った金額を追加し、割り勘を設定することができます。",[430,7371,7372],{},"精算（Settlement）パネルは、グリーディー・マッチング（貪欲法）アルゴリズムを実行して、誰が誰にいくら支払うべきかを計算し、送金回数が最小限になる精算方法を提案します。",[885,7374,7376],{"id":7375},"_6-model-context-protocol-mcpを活用したai駆動の旅行計画","6. Model Context Protocol (MCP)を活用したAI駆動の旅行計画",[430,7378,7379,7380,7383],{},"TREKには",[448,7381,7382],{},"MCP（Model Context Protocol）サーバー","が内蔵されています。これにより、AIエージェントがあなたの旅行データに直接アクセスして、読み書きすることができます。旅行、スポット、予算、持ち物、予約、コラボレーションなど、150以上のツールと30の主要なリソースをカバーしています。",[2166,7385,7387],{"id":7386},"_61-cloudflare-zero-trust","6.1 Cloudflare Zero Trust",[430,7389,7390,7391,7393,7394],{},"TREKを",[441,7392,1733],{"href":363},"環境の配下で運用している場合、ドメインをスプリットトンネル（Split Tunnels）のインクルージョンリスト（除外・バイパスリスト）に追加する必要があります。そうしないと、OAuth認証時に問題が発生する可能性があります。詳細については、こちらのGitHub Issueを参照してください：",[441,7395,7398],{"href":7396,"rel":7397},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fissues\u002F1463",[445],"GitHub Issue",[461,7400],{"description":2611,"image":2612,"image-alt":2613,"label":4236,"min-read":1280,"title":1717,"to":363},[433,7402],{"src":7403,"alt":7404,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fcloudflare-zero-trust-split-tunnels-domain.webp","Cloudflare Warpスプリットトンネルへのカスタムドメインの追加",[2166,7406,7408],{"id":7407},"_62-claude-desktop","6.2 Claude Desktop",[481,7410,7411],{},[484,7412,7413,7414],{},"New Client（新規クライアント）をクリックして、AIエージェントクライアントを作成します：\n",[433,7415],{"src":7416,"alt":7417,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-register-new-mcp-client.webp","設定画面での新規カスタムクライアントトークンの登録",[430,7419,7420],{},"Claude Desktopタブを選択し、Register Client（クライアントを登録）をクリックします：",[433,7422],{"src":7423,"alt":7424,"style":7425},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-claude-desktop-client-credentials.webp","Claude Desktopクライアント認証情報の生成","max-width: 354px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7427,7428],{},"クライアントIDとクライアントシークレットのペアが表示されます。これらを安全な場所に保存してください。次に、Client Configuration（クライアント設定）をクリックして、MCP設定を表示します：",[433,7430],{"src":7431,"alt":7432,"style":7433},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-mcp-client-configuration-block.webp","フォーマット済みのMCPサーバー設定ブロックの取得","max-width: 508px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7435,7436],{},"Claude DesktopでEdit Configをクリックし、ローカルのMCPサーバー設定ファイルを開きます：",[433,7438],{"src":7439,"alt":7440,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-config-json.webp","Claude DesktopのローカルMCP設定JSONファイルの編集",[430,7442,7443],{},"TREKの設定を貼り付け、プレースホルダー部分をご自身の情報に置き換えます：",[930,7445,7447],{"className":2912,"code":7446,"language":2914,"meta":425,"style":425},"  \"mcpServers\": {\n    \"trek\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n        \"--static-oauth-client-info\",\n        \"{\\\"client_id\\\": \\\"\u003Cyour_client_id>\\\", \\\"client_secret\\\": \\\"\u003Cyour_client_secret>\\\"}\"\n      ]\n    }\n  },\n",[491,7448,7449,7464,7477,7499,7513,7525,7536,7547,7592,7597,7602],{"__ignoreMap":425},[938,7450,7451,7454,7457,7459,7462],{"class":940,"line":941},[938,7452,7453],{"class":952},"  \"",[938,7455,7456],{"class":1051},"mcpServers",[938,7458,3687],{"class":952},[938,7460,7461],{"class":948},": ",[938,7463,2921],{"class":952},[938,7465,7466,7469,7471,7473,7475],{"class":940,"line":1067},[938,7467,7468],{"class":952},"    \"",[938,7470,6754],{"class":944},[938,7472,3687],{"class":952},[938,7474,1366],{"class":952},[938,7476,2951],{"class":952},[938,7478,7479,7482,7485,7487,7489,7491,7494,7496],{"class":940,"line":1074},[938,7480,7481],{"class":952},"      \"",[938,7483,7484],{"class":1047},"command",[938,7486,3687],{"class":952},[938,7488,1366],{"class":952},[938,7490,3285],{"class":952},[938,7492,7493],{"class":1051},"npx",[938,7495,3687],{"class":952},[938,7497,7498],{"class":952},",\n",[938,7500,7501,7503,7506,7508,7510],{"class":940,"line":1081},[938,7502,7481],{"class":952},[938,7504,7505],{"class":1047},"args",[938,7507,3687],{"class":952},[938,7509,1366],{"class":952},[938,7511,7512],{"class":952}," [\n",[938,7514,7515,7518,7521,7523],{"class":940,"line":1933},[938,7516,7517],{"class":952},"        \"",[938,7519,7520],{"class":1051},"mcp-remote",[938,7522,3687],{"class":952},[938,7524,7498],{"class":952},[938,7526,7527,7529,7532,7534],{"class":940,"line":1938},[938,7528,7517],{"class":952},[938,7530,7531],{"class":1051},"https:\u002F\u002Ftrek.pafor.me\u002Fmcp",[938,7533,3687],{"class":952},[938,7535,7498],{"class":952},[938,7537,7538,7540,7543,7545],{"class":940,"line":1944},[938,7539,7517],{"class":952},[938,7541,7542],{"class":1051},"--static-oauth-client-info",[938,7544,3687],{"class":952},[938,7546,7498],{"class":952},[938,7548,7549,7551,7553,7556,7559,7561,7563,7565,7568,7570,7572,7574,7577,7579,7581,7583,7586,7588,7590],{"class":940,"line":2277},[938,7550,7517],{"class":952},[938,7552,2942],{"class":1051},[938,7554,7555],{"class":948},"\\\"",[938,7557,7558],{"class":1051},"client_id",[938,7560,7555],{"class":948},[938,7562,7461],{"class":1051},[938,7564,7555],{"class":948},[938,7566,7567],{"class":1051},"\u003Cyour_client_id>",[938,7569,7555],{"class":948},[938,7571,750],{"class":1051},[938,7573,7555],{"class":948},[938,7575,7576],{"class":1051},"client_secret",[938,7578,7555],{"class":948},[938,7580,7461],{"class":1051},[938,7582,7555],{"class":948},[938,7584,7585],{"class":1051},"\u003Cyour_client_secret>",[938,7587,7555],{"class":948},[938,7589,2948],{"class":1051},[938,7591,1965],{"class":952},[938,7593,7594],{"class":940,"line":2288},[938,7595,7596],{"class":952},"      ]\n",[938,7598,7599],{"class":940,"line":2384},[938,7600,7601],{"class":952},"    }\n",[938,7603,7604,7607],{"class":940,"line":2390},[938,7605,7606],{"class":952},"  }",[938,7608,7498],{"class":948},[430,7610,7611],{},"Claude Desktopを再起動すると、ローカルMCPサーバー（Local MCP servers）に接続されたTREKサーバーが表示されます：",[433,7613],{"src":7614,"alt":7615,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-trek-server-connected.webp","Claudeの画面内でのTREK接続アクティブステータスの確認",[430,7617,7618],{},"これで、自然言語プロンプトを実行できます：",[433,7620],{"src":7621,"alt":7622,"style":7623},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-natural-language-prompt.webp","旅行データを操作するための自然言語によるClaudeへの指示","max-width: 550px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7625,7626],{},"自然言語で支出を追加してみましょう：",[930,7628,7631],{"className":7629,"code":7630,"language":4636,"meta":425},[4634],"For the West Europe trip, the Grab from KLIA1 to the hotel cost RM115.90 on 26\u002F4\u002F2025. Please add it as an expense without split to the trip.\n",[491,7632,7630],{"__ignoreMap":425},[433,7634],{"src":7635,"alt":7636,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-expense-response.webp","ツールを使って自動的に経費を記録するClaudeの応答",[430,7638,7639],{},"「Costs」ページを確認すると、支払人が言及されなかったため、「まだ誰も支払っていません（No one paid yet）」という状態で支出が作成されます：",[433,7641],{"src":7642,"alt":7643,"style":6729},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-costs-page-mcp-parsed-expense.webp","経費画面での新規登録されたAI解析支出の確認",[430,7645,7646],{},"持ち物リストへの追加も同様に行うことができます：",[433,7648],{"src":7649,"alt":7650,"style":7651},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fclaude-desktop-mcp-add-packing-items.webp","自然言語プロンプトを使って持ち物リストを追加するClaude","max-width: 631px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7653,7654],{},"「Packing List」ページを更新すると、3つのアイテムが追加されています：",[433,7656],{"src":7657,"alt":7658,"style":7659},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Ftrek-packing-list-mcp-parsed-items.webp","持ち物リスト画面での新しく解析された持ち物の確認","max-width: 312px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[2166,7661,7663],{"id":7662},"_63-gemini-cli動的登録","6.3 Gemini CLI（動的登録）",[430,7665,7666,7667,7670],{},"Gemini CLIは動的登録（Dynamic Registration）をサポートしているため、事前にクライアントを登録する必要はありません。",[491,7668,7669],{},".gemini\u002Fsettings.json","に以下を追加してください：",[930,7672,7674],{"className":2912,"code":7673,"language":2914,"meta":425,"style":425},"    \"trek\": {\n      \"httpUrl\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[491,7675,7676,7688,7707,7720,7733,7738],{"__ignoreMap":425},[938,7677,7678,7680,7682,7684,7686],{"class":940,"line":941},[938,7679,7468],{"class":952},[938,7681,6754],{"class":1051},[938,7683,3687],{"class":952},[938,7685,7461],{"class":948},[938,7687,2921],{"class":952},[938,7689,7690,7692,7695,7697,7699,7701,7703,7705],{"class":940,"line":1067},[938,7691,7481],{"class":952},[938,7693,7694],{"class":944},"httpUrl",[938,7696,3687],{"class":952},[938,7698,1366],{"class":952},[938,7700,3285],{"class":952},[938,7702,7531],{"class":1051},[938,7704,3687],{"class":952},[938,7706,7498],{"class":952},[938,7708,7709,7711,7714,7716,7718],{"class":940,"line":1074},[938,7710,7481],{"class":952},[938,7712,7713],{"class":944},"oauth",[938,7715,3687],{"class":952},[938,7717,1366],{"class":952},[938,7719,2951],{"class":952},[938,7721,7722,7724,7727,7729,7731],{"class":940,"line":1081},[938,7723,7517],{"class":952},[938,7725,7726],{"class":1047},"enabled",[938,7728,3687],{"class":952},[938,7730,1366],{"class":952},[938,7732,1388],{"class":952},[938,7734,7735],{"class":940,"line":1933},[938,7736,7737],{"class":952},"      }\n",[938,7739,7740],{"class":940,"line":1938},[938,7741,7601],{"class":952},[430,7743,7744,7745,7748,7749],{},"ターミナルで",[491,7746,7747],{},"gemini","を実行し、認証プロンプトが表示されたらApprove（承認）をクリックします：\n",[433,7750],{"src":7751,"alt":7752,"style":7753},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fmcp-client-oauth-authorization-prompt.webp","TREK MCPサーバーへのOAuthアクセスの承認画面","max-width: 488px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7755,7756],{},"シンプルなプロンプトから始めてみましょう：",[433,7758],{"src":7759,"alt":7760,"style":7761},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-prompt-itinerary.webp","旅行日程を取得するためのGemini CLIへの指示","max-width: 415px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[433,7763],{"src":7764,"alt":7765,"style":7088},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fgemini-cli-mcp-display-itinerary.webp","構造化された旅行情報を正常に表示するGemini CLI",[2166,7767,7769],{"id":7768},"_64-kimi-cli動的登録","6.4 Kimi CLI（動的登録）",[430,7771,7772,7773,7776,7777,7780],{},"やり方は同様です。",[491,7774,7775],{},"\u002FUsers\u002F\u003Cuser>\u002F.kimi\u002F","フォルダにある",[491,7778,7779],{},"mcp.json","に以下を追加します：",[930,7782,7784],{"className":2912,"code":7783,"language":2914,"meta":425,"style":425},"    \"trek\": {\n      \"type\": \"http\",\n      \"url\": \"https:\u002F\u002Ftrek.pafor.me\u002Fmcp\",\n      \"auth\": \"oauth\"\n    }\n",[491,7785,7786,7798,7818,7836,7853],{"__ignoreMap":425},[938,7787,7788,7790,7792,7794,7796],{"class":940,"line":941},[938,7789,7468],{"class":952},[938,7791,6754],{"class":1051},[938,7793,3687],{"class":952},[938,7795,7461],{"class":948},[938,7797,2921],{"class":952},[938,7799,7800,7802,7805,7807,7809,7811,7814,7816],{"class":940,"line":1067},[938,7801,7481],{"class":952},[938,7803,7804],{"class":944},"type",[938,7806,3687],{"class":952},[938,7808,1366],{"class":952},[938,7810,3285],{"class":952},[938,7812,7813],{"class":1051},"http",[938,7815,3687],{"class":952},[938,7817,7498],{"class":952},[938,7819,7820,7822,7824,7826,7828,7830,7832,7834],{"class":940,"line":1074},[938,7821,7481],{"class":952},[938,7823,869],{"class":944},[938,7825,3687],{"class":952},[938,7827,1366],{"class":952},[938,7829,3285],{"class":952},[938,7831,7531],{"class":1051},[938,7833,3687],{"class":952},[938,7835,7498],{"class":952},[938,7837,7838,7840,7843,7845,7847,7849,7851],{"class":940,"line":1081},[938,7839,7481],{"class":952},[938,7841,7842],{"class":944},"auth",[938,7844,3687],{"class":952},[938,7846,1366],{"class":952},[938,7848,3285],{"class":952},[938,7850,7713],{"class":1051},[938,7852,1965],{"class":952},[938,7854,7855],{"class":940,"line":1933},[938,7856,7601],{"class":952},[430,7858,7744,7859,7862,7863],{},[491,7860,7861],{},"kimi mcp auth trek","を実行し、Approveをクリックします：\n",[433,7864],{"src":7751,"alt":7752,"style":7865},"max-width: 453px; width: 100%; height: auto; border-radius: 8px; margin: 1.5rem auto; display: block;",[430,7867,7868],{},"認証されると、利用可能なツールが一覧表示されます：",[433,7870],{"src":7871,"alt":7872,"style":6571},"https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002Fkimi-cli-mcp-authorized-tools-list.webp","認証成功後に使用可能なツール一覧を表示するKimi CLI",[885,7874,7876],{"id":7875},"_7-モバイルでの利用体験","7. モバイルでの利用体験",[430,7878,7879],{},"TREKは、モバイルデバイスではPWA（Progressive Web App）として動作します。サービスワーカーがマップタイルやAPIデータをキャッシュするため、オフライン環境でも旅程を確認することができます。ただし、ネイティブアプリと比較すると、プッシュ通知に多少の遅延が発生する場合があります。",[885,7881,6149],{"id":6149},[430,7883,7884],{},"MCPを介してAIエージェントを接続することで、フライトや宿泊施設の予約データを手動で入力する手間を大幅に削減できます。また、AIエージェントは旅行日程や季節に応じたお勧めの観光スポットを提案することも可能です。AIエージェントとの一度の対話で、リサーチや旅程の作成から、予算管理、持ち物リストの整理まで、旅行計画のすべてのステップをカバーできます。",[430,7886,7887],{},"ただし、いくつか軽微な不具合も見受けられます。例えば、PDFから予約をインポートする際、実際に支払った通貨ではなく、旅行の基本通貨（デフォルト通貨）に自動設定されてしまうことがあります。また、「Collections」で新しいリストを作成する際、作成時に入力したカバー画像が保存後に消えてしまうことがあります（ただし、編集画面から手動で再追加することは可能です）。",[430,7889,7890],{},"また、ご自身のサーバーにこれをホストする必要があるため、導入には多少の技術的なハードルがあります。TREKは主に、頻繁に旅行に行き、旅のデータをこだわりを持って整理したい方向けに設計されています。セルフホストを検討する前に、demo.liketrek.comで公式デモを試してみることをお勧めします。",[885,7892,7893],{"id":1621},"参考リンク:",[481,7895,7896,7903,7910],{},[484,7897,7898],{},[441,7899,7902],{"href":7900,"rel":7901},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FQuick-Start",[445],"TREK Quick Start",[484,7904,7905],{},[441,7906,7909],{"href":7907,"rel":7908},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FTroubleshooting",[445],"TREK Troubleshooting",[484,7911,7912],{},[441,7913,7916],{"href":7914,"rel":7915},"https:\u002F\u002Fgithub.com\u002Fliketrek\u002FTREK\u002Fwiki\u002FMCP-Scopes",[445],"TREK MCP Scopes",[1650,7918,7919],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":425,"searchDepth":1067,"depth":1074,"links":7921},[7922,7927,7928,7938,7946,7952,7958,7959,7960],{"id":6267,"depth":1074,"text":6268,"children":7923},[7924,7925,7926],{"id":6271,"depth":1081,"text":6272},{"id":6417,"depth":1081,"text":6417},{"id":6448,"depth":1081,"text":6448},{"id":6592,"depth":1074,"text":6593},{"id":6635,"depth":1074,"text":6636,"children":7929},[7930,7931,7932,7933,7934,7935,7936,7937],{"id":6732,"depth":1081,"text":6733},{"id":6743,"depth":1081,"text":6744},{"id":6815,"depth":1081,"text":6816},{"id":6829,"depth":1081,"text":6830},{"id":6851,"depth":1081,"text":6852},{"id":6865,"depth":1081,"text":6866},{"id":6876,"depth":1081,"text":6877},{"id":6887,"depth":1081,"text":6888},{"id":6916,"depth":1074,"text":6917,"children":7939},[7940,7941,7942,7943,7944,7945],{"id":6923,"depth":1081,"text":6924},{"id":6945,"depth":1081,"text":6946},{"id":7004,"depth":1081,"text":7005},{"id":7024,"depth":1081,"text":7025},{"id":7040,"depth":1081,"text":7041},{"id":7065,"depth":1081,"text":7066},{"id":7096,"depth":1074,"text":7097,"children":7947},[7948,7949,7950,7951],{"id":7113,"depth":1081,"text":7114},{"id":7212,"depth":1081,"text":7213},{"id":7275,"depth":1081,"text":7276},{"id":7358,"depth":1081,"text":7359},{"id":7375,"depth":1074,"text":7376,"children":7953},[7954,7955,7956,7957],{"id":7386,"depth":1081,"text":7387},{"id":7407,"depth":1081,"text":7408},{"id":7662,"depth":1081,"text":7663},{"id":7768,"depth":1081,"text":7769},{"id":7875,"depth":1074,"text":7876},{"id":6149,"depth":1074,"text":6149},{"id":1621,"depth":1074,"text":7893},[7962,1670],"travel","2026-09-01","Dockerを使用してオープンソースの旅行プランナー「TREK」をデプロイし、CaddyリバースプロキシやCloudflare R2と連携させてセキュアに運用する方法を徹底解説。さらに、MCP経由でAIエージェントと接続し、自然言語で旅行の予約、旅費、持ち物リストを自動整理・一元管理してスマートに旅を計画しましょう。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSelf%20hosted%20travel%20planner%20TREK\u002FJA-Self-hosted-travel-planner-TREK.webp","温かみのある羊皮紙の背景に表示された、TREKセルフホスト旅行プランナーダッシュボードの高品質ミニマリスト3Dイラスト。",{"schemaOrg":7968,"robots":1704,"sitemap":7972},[7969,7970],{"@type":1683,"headline":6253,"description":7964},{"@type":4080,"headline":7971,"description":7964},"セルフホスト型AI旅行プランナー「TREK」の構築方法：Dockerによる簡単デプロイと便利な活用術",{"lastmod":7963},{"title":7971,"description":7964,"ogTitle":6253,"ogDescription":7964,"twitterTitle":6253,"twitterDescription":7964},"ja\u002Farticle\u002Fself-hosted-travel-planner-trek",[6247,7976,6248,6249,7977],"TREK","MCP","EEKRUAZ6vDrf0BiekEf_HPy9TiOvDIrZQrpAkxNubms",{"id":7980,"title":7981,"author":425,"body":7982,"category":8581,"date":8582,"description":8583,"extension":1675,"image":8584,"imageAlt":8585,"isPublished":1070,"meta":8586,"minRead":1067,"navigation":1070,"path":189,"seo":8590,"stem":8592,"tags":8593,"updatedAt":1713,"__hash__":8596},"article\u002Fja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts.md","Nuxtアプリの環境構築・初期化を自動化：AIエージェントのスキルが従来のシェルスクリプトに代わる理由",{"type":427,"value":7983,"toc":8574},[7984,7994,7997,8000,8003,8099,8102,8145,8148,8152,8159,8166,8169,8205,8209,8220,8393,8397,8480,8484,8493,8513,8520,8535,8546,8549,8555,8558,8563,8571],[430,7985,7986,7987,1524,7990,7993],{},"Nuxtフレームワークを使って新しいアプリケーションの開発を始めるとき、モジュールのインストールや、",[491,7988,7989],{},"nuxt.config.ts",[491,7991,7992],{},"wrangler.jsonc","などの設定ファイルのセットアップといった、退屈で煩雑な手順を踏む必要があります。シェルスクリプトを使えばこのプロセスを自動化できますが、プロジェクトの要件や構成のバリエーションが増えるにつれて、スクリプトによる対応はすぐに限界を迎えます。",[430,7995,7996],{},"そこで私たちは、従来の「スクリプト」によるアプローチを見直し、AIエージェントの**「スキル（Agent Skill）」**へと置き換える検証を行いました。",[472,7998,7999],{"id":7999},"従来のシェルスクリプトが得意なこと",[430,8001,8002],{},"スクリプトは、あらかじめ決定された固定の処理手順を、コード内に直接ハードコードされたロジックに従って順番に実行することに長けています。",[930,8004,8006],{"className":1038,"code":8005,"language":1040,"meta":425,"style":425},"#!\u002Fusr\u002Fbin\u002Fenv bash\nset -e\n\nnpx nuxi@latest init \"$1\" --template minimal --packageManager pnpm --no-gitInit -M @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n\ncd \"$1\"\n\ncp ~\u002Ftemplates\u002Fnuxt.config.ts .\ncp ~\u002Ftemplates\u002Fwrangler.jsonc .\n",[491,8007,8008,8013,8020,8024,8063,8067,8077,8081,8090],{"__ignoreMap":425},[938,8009,8010],{"class":940,"line":941},[938,8011,8012],{"class":1077},"#!\u002Fusr\u002Fbin\u002Fenv bash\n",[938,8014,8015,8018],{"class":940,"line":1067},[938,8016,8017],{"class":970},"set",[938,8019,5194],{"class":1051},[938,8021,8022],{"class":940,"line":1074},[938,8023,1071],{"emptyLinePlaceholder":1070},[938,8025,8026,8028,8031,8034,8036,8040,8042,8045,8048,8051,8054,8057,8060],{"class":940,"line":1081},[938,8027,7493],{"class":1047},[938,8029,8030],{"class":1051}," nuxi@latest",[938,8032,8033],{"class":1051}," init",[938,8035,3285],{"class":952},[938,8037,8039],{"class":8038},"sHdIc","$1",[938,8041,3687],{"class":952},[938,8043,8044],{"class":1051}," --template",[938,8046,8047],{"class":1051}," minimal",[938,8049,8050],{"class":1051}," --packageManager",[938,8052,8053],{"class":1051}," pnpm",[938,8055,8056],{"class":1051}," --no-gitInit",[938,8058,8059],{"class":1051}," -M",[938,8061,8062],{"class":1051}," @nuxt\u002Fui,@nuxthub\u002Fcore,@vueuse\u002Fnuxt\n",[938,8064,8065],{"class":940,"line":1933},[938,8066,1071],{"emptyLinePlaceholder":1070},[938,8068,8069,8071,8073,8075],{"class":940,"line":1938},[938,8070,2818],{"class":970},[938,8072,3285],{"class":952},[938,8074,8039],{"class":8038},[938,8076,1965],{"class":952},[938,8078,8079],{"class":940,"line":1944},[938,8080,1071],{"emptyLinePlaceholder":1070},[938,8082,8083,8085,8088],{"class":940,"line":2277},[938,8084,2835],{"class":1047},[938,8086,8087],{"class":1051}," ~\u002Ftemplates\u002Fnuxt.config.ts",[938,8089,4890],{"class":1051},[938,8091,8092,8094,8097],{"class":940,"line":2288},[938,8093,2835],{"class":1047},[938,8095,8096],{"class":1051}," ~\u002Ftemplates\u002Fwrangler.jsonc",[938,8098,4890],{"class":1051},[430,8100,8101],{},"しかし、このスクリプトは以下のような課題に直面すると、途端に機能しなくなります。",[481,8103,8104,8118,8135],{},[484,8105,8106,8109,8110,8113,8114,8117],{},[448,8107,8108],{},"固定されたデフォルト設定。"," 上記のスクリプトでは UIモジュールとして ",[491,8111,8112],{},"Nuxt UI"," がハードコードされています。もし ",[491,8115,8116],{},"Ant Design UI"," モジュールを使いたい場合はどうすればよいでしょうか？モジュールの選択肢が増えるたびに、ユーザーが指定しなければならないコマンド引数は増え続けます。",[484,8119,8120,8123,8124,8127,8128,1842,8131,8134],{},[448,8121,8122],{},"ユーザーの「意図」を読み取れない。"," 「ブログを作りたい」という要望には ",[491,8125,8126],{},"@nuxt\u002Fcontent"," が必要ですが、「ニュースレター機能付きのWebサイトを作りたい」という要望には ",[491,8129,8130],{},"Cloudflare D1",[491,8132,8133],{},"Drizzle"," が必要です。スクリプト単体ではこの要件の違いを自律的に判断できず、構成のパリエーションごとに個別のスクリプトを作成しなければなりません。",[484,8136,8137,8140,8141,8144],{},[448,8138,8139],{},"気づかないうちに風化・形骸化する。"," Nuxtなどのフレームワークは、メジャーアップデートの際に設計 convention が大きく変更されます。たとえば、Nuxt 4 ではソースディレクトリが ",[491,8142,8143],{},"app\u002F"," に変更されました。Nuxt 3 向けに書かれたスクリプトをそのまま使い続けると、誤ったディレクトリ構造で静かにスキャフォールディングが実行され、エラーを引き起こすまでユーザーは問題に気づきません。",[430,8146,8147],{},"**アプリケーションの初期構築（App Scaffolding）**は、「単純な処理の実行」ではなく「高度な意思決定」が求められる課題です。そのため、考慮すべき決定事項が増えれば増やすほど、スクリプトによる自動化はスケールしなくなります。",[472,8149,8151],{"id":8150},"なぜ従来のスクリプトではなくaiエージェントスキルを使うのか","なぜ従来のスクリプトではなく「AIエージェントスキル」を使うのか？",[430,8153,8154,8155,8158],{},"エージェントスキル（Agent Skill）とは、単に実行されるプログラムのコードではなく、**「AIエージェントが動作するために従う知識の体系」**です。スキルは ",[491,8156,8157],{},"SKILL.md"," という設計書ファイルを中心に構成され、タスクの実行に必要な関連リファレンスドキュメント、テンプレート、および実行スクリプトなどを柔軟に同梱できます。",[430,8160,8161,8162,8165],{},"エージェントスキルの具体的な仕組みについては、解説記事 ",[441,8163,8164],{"href":351},"AIエージェントのスキルとは？その基本概念から作成方法、再利用可能なワークフローの構築までを徹底解説"," で詳しく紹介しています。",[430,8167,8168],{},"AIエージェントのスキルは、シェルスクリプトとしての確実な実行力を維持しつつ、スクリプトにはない「自律的で合理的な判断力」をプロセスに追加してくれます。",[481,8170,8171,8174,8184,8199,8202],{},[484,8172,8173],{},"ユーザーの曖昧な指示（自然言語）から意図を推測し、データベースが必要かどうかを賢く判断します。",[484,8175,8176,8177,1524,8180,8183],{},"指定されたオプションリストから、本当に必要なオプションモジュールだけをインテリジェントに選択・導入します（例：",[491,8178,8179],{},"Nuxt Content",[491,8181,8182],{},"i18n","、分析ツールなどは、ユーザーの要件に応じてオプトインで追加されます）。",[484,8185,8186,8187,8190,8191,8194,8195,8198],{},"最新の ",[491,8188,8189],{},"Nuxt"," フレームワーク、Cloudflare 連携用の ",[491,8192,8193],{},"NuxtHub","、およびデプロイ用の ",[491,8196,8197],{},"Wrangler"," など、目まぐるしく変化するエコシステムの最新仕様に自律的に適応します。",[484,8200,8201],{},"実行途中でエラーが発生した場合、エージェント自身でエラー原因を分析して自己修復・リトライを試みます。",[484,8203,8204],{},"プロジェクトの構築完了前に、事前に定義されたチェックリストに沿って動作確認と品質チェックを自律的に実施します。",[472,8206,8208],{"id":8207},"nuxt-cloudflare-スキャフォールディングスキルの裏側","Nuxt & Cloudflare スキャフォールディングスキルの裏側",[430,8210,8211,8212,8219],{},"私たちが作成した ",[441,8213,8216],{"href":8214,"rel":8215},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill",[445],[491,8217,8218],{},"scaffold-nuxt-cloudflare-app-skill"," は、以下のステップに沿って、本番環境を見据えた高品質な初期構築を自律的に実行します。",[529,8221,8222,8253,8273,8298,8328,8367,8374],{},[484,8223,8224,1377,8227],{},[448,8225,8226],{},"曖昧な要件の具体化",[481,8228,8229,8237,8243],{},[484,8230,8231,8232,7167,8234,754],{},"UIキットの選択（デフォルトは ",[448,8233,8112],{},[448,8235,8236],{},"Antdv Next",[484,8238,8239,8240,8242],{},"データベースの要否（例：",[448,8241,8130],{}," の有無）",[484,8244,8245,8246,8248,8249,8252],{},"CMS用の ",[491,8247,8126],{}," や多言語化用の ",[491,8250,8251],{},"@nuxtjs\u002Fi18n"," などの追加モジュールの要否",[484,8254,8255,7461,8258,8261,8262,8264,8265,8268,8269,8272],{},[448,8256,8257],{},"ベースアプリケーションの構築",[491,8259,8260],{},"pnpm dlx nuxi@latest init"," を実行して、最新バージョンの Nuxt フレームワークを ",[491,8263,3577],{}," パッケージマネージャー構成で初期化します。さらに、Cloudflare のビルド環境で ",[491,8266,8267],{},"better-sqlite3"," や ",[491,8270,8271],{},"sharp"," などのネイティブライブラリが正常にビルドできるよう、環境変数や設定を適切に構成します。",[484,8274,8275,7461,8278,8281,8282,1524,8285,1524,8288,1524,8291,1524,8294,8297],{},[448,8276,8277],{},"意思決定マトリクスによるモジュール導入",[491,8279,8280],{},"@nuxt\u002Fui"," \u002F ",[491,8283,8284],{},"@antdv-next\u002Fnuxt",[491,8286,8287],{},"@nuxt\u002Fimage",[491,8289,8290],{},"@nuxtjs\u002Fseo",[491,8292,8293],{},"@nuxthub\u002Fcore",[491,8295,8296],{},"@vueuse\u002Fnuxt"," などの必須・推奨モジュールに加え、ユーザーの要望に応じて Drizzle \u002F D1、Nuxt Content、i18n を条件分岐でインストールします。",[484,8299,8300,1377,8303],{},[448,8301,8302],{},"最適なディレクトリ構造の展開",[481,8304,8305,8310,8315,8320,8325],{},[484,8306,8307,8309],{},[491,8308,8143],{}," （Nuxt 4 準拠）",[484,8311,8312],{},[491,8313,8314],{},"server\u002F",[484,8316,8317],{},[491,8318,8319],{},"shared\u002F",[484,8321,8322],{},[491,8323,8324],{},"tests\u002F",[484,8326,8327],{},"ルート直下の各種設定ファイル",[484,8329,8330,1377,8335],{},[448,8331,8332,8334],{},[491,8333,7989],{}," の詳細設定",[481,8336,8337,8347,8354,8361],{},[484,8338,8339,8340,8268,8343,8346],{},"SEO向上のための ",[491,8341,8342],{},"site.url",[491,8344,8345],{},"site.name"," の設定",[484,8348,8349,8350,8353],{},"Cloudflare バインディング用の NuxtHub ",[491,8351,8352],{},"hub"," ブロックの記述",[484,8355,8356,8357,8360],{},"ルーティングとキャッシュの制御を行う ",[491,8358,8359],{},"routeRules"," の生成",[484,8362,8186,8363,8366],{},[491,8364,8365],{},"compatibilityDate"," の指定",[484,8368,8369],{},[448,8370,8371,8373],{},[491,8372,7992],{}," の自動生成とバインディング",[484,8375,8376,7461,8379,1842,8382,8385,8386,3141,8389,8392],{},[448,8377,8378],{},"開発環境の堅牢化とテスト",[491,8380,8381],{},"Vitest",[491,8383,8384],{},"ESLint"," をセットアップし、最後に自律的に ",[491,8387,8388],{},"pnpm install",[491,8390,8391],{},"pnpm dev"," を実行して動作確認を行います。すべての正常動作が確認された段階で、初めて初期構築作業の完了を宣言します。",[472,8394,8396],{"id":8395},"シェルスクリプト-vs-aiエージェントスキル機能対比","シェルスクリプト vs AIエージェントスキル：機能対比",[600,8398,8399,8412],{},[603,8400,8401],{},[606,8402,8403,8406,8409],{},[609,8404,8405],{},"比較項目",[609,8407,8408],{},"シェルスクリプト",[609,8410,8411],{},"エージェントスキル",[618,8413,8414,8425,8436,8447,8458,8469],{},[606,8415,8416,8419,8422],{},[623,8417,8418],{},"ユーザーの意図の理解",[623,8420,8421],{},"❌ 固定された挙動のみ",[623,8423,8424],{},"✅ 要件に応じて柔軟に適応",[606,8426,8427,8430,8433],{},[623,8428,8429],{},"柔軟な意思決定",[623,8431,8432],{},"❌ コマンド引数による事前定義のみ",[623,8434,8435],{},"✅ 実行時に状況から自律判断",[606,8437,8438,8441,8444],{},[623,8439,8440],{},"フレームワークの更新",[623,8442,8443],{},"❌ 手動でコードを書き換える必要あり",[623,8445,8446],{},"✅ 現在の最新エコシステムを検証し適応",[606,8448,8449,8452,8455],{},[623,8450,8451],{},"エラー発生時の復旧",[623,8453,8454],{},"❌ 処理がそこで停止する",[623,8456,8457],{},"✅ エラー原因を特定し自律的に自己修復",[606,8459,8460,8463,8466],{},[623,8461,8462],{},"成果物の品質検証",[623,8464,8465],{},"❌ チェック機能なし",[623,8467,8468],{},"✅ 最終チェックリストによる自動テスト",[606,8470,8471,8474,8477],{},[623,8472,8473],{},"メンテナンスコスト",[623,8475,8476],{},"❌ 引数や分岐ロジックの肥大化",[623,8478,8479],{},"✅ マークダウン（設計書）の修正だけで完結",[472,8481,8483],{"id":8482},"npx-skills-cli-を使った-aiエージェントスキルのインストール方法","npx skills CLI を使った AIエージェントスキルのインストール方法",[430,8485,8486,8487,8492],{},"エージェントスキルの導入は、オープンソースの ",[441,8488,8491],{"href":8489,"rel":8490},"https:\u002F\u002Fgithub.com\u002Fvercel-labs\u002Fskills",[445],"skills CLI"," を使うことで、たった1つのコマンドで完了します。",[930,8494,8496],{"className":1038,"code":8495,"language":1040,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git -g\n",[491,8497,8498],{"__ignoreMap":425},[938,8499,8500,8502,8505,8507,8510],{"class":940,"line":941},[938,8501,7493],{"class":1047},[938,8503,8504],{"class":1051}," skills",[938,8506,1061],{"class":1051},[938,8508,8509],{"class":1051}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fscaffold-nuxt-cloudflare-app-skill.git",[938,8511,8512],{"class":1051}," -g\n",[430,8514,8515,8516],{},"このコマンドを実行すると、CLI がリポジトリを自動的にクローンし、検出されたスキルを現在あなたの環境に導入されているどのエージェントに紐付けるかを尋ねてきます。\n",[433,8517],{"alt":8518,"src":8519},"npx skills add コマンドを実行して、ターミナル上でNuxt環境構築用のスキルをグローバルにインストールする様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-add-scaffold-nuxt-installation.webp",[430,8521,8522,8523,8526,8527,8530,8531],{},"今回は、推奨されるインストール方法である ",[448,8524,8525],{},"Symlink（シンボリックリンク）"," を選択します。これにより、スキルは ",[491,8528,8529],{},"~\u002F.agents\u002Fskills"," に一度だけダウンロードされ、選択したすべてのエージェントがその同一のオリジナルファイルを参照するようになります。\n",[433,8532],{"alt":8533,"src":8534},"シンボリックリンク（Symlink）を利用して、~\u002F.agents\u002Fskills に一度だけスキルをインストールするセットアップ完了画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fnpx-skills-installation-summary-details.webp",[481,8536,8537],{},[484,8538,8539],{},[905,8540,8541,8542,8545],{},"複数の異なるAIエージェントにスキルを一元管理して配布する手法の詳細は、解説記事 ",[441,8543,8544],{"href":359},"npx skillsを使ってAIエージェントのスキルフラグメンテーション（機能の断片化）を解消する方法"," をご参照ください。",[430,8547,8548],{},"インストール完了後、Claude Code を起動すると、新しいコマンドとして認識されていることが確認できます。",[430,8550,8551],{},[433,8552],{"alt":8553,"src":8554},"Claude Code のターミナル画面上に新しく追加された環境構築用の \u002Fscaffold-nuxt スラッシュコマンドが表示されている様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002Fclaude-code-scaffold-nuxt-slash-command-active.webp",[430,8556,8557],{},"あとは、普段の自然言語で指示を出すだけで、完璧な環境が数秒で構築されます。",[2512,8559,8560],{},[430,8561,8562],{},"\"Scaffold a new Nuxt app deployed to Cloudflare Workers — Nuxt UI, a blog section, and a D1 database\"\n（Cloudflare Workers にデプロイ可能な Nuxt アプリの雛形を作って。UI は Nuxt UI で、ブログセクションと D1 データベースも含めてほしい）",[430,8564,8565,8566,8570],{},"このスキャフォールディングスキルはオープンソースとして公開されています。ぜひ ",[441,8567,8569],{"href":8214,"rel":8568},[445],"GitHub リポジトリ"," をチェックして、その劇的な効率化を体験してみてください。",[1650,8572,8573],{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1067,"depth":1074,"links":8575},[8576,8577,8578,8579,8580],{"id":7999,"depth":1067,"text":7999},{"id":8150,"depth":1067,"text":8151},{"id":8207,"depth":1067,"text":8208},{"id":8395,"depth":1067,"text":8396},{"id":8482,"depth":1067,"text":8483},[1670],"2026-08-25","Cloudflare Workers上にNuxtアプリを自動構築する方法を徹底解説。従来の壊れやすいシェルスクリプトを、開発者の意図を組んで柔軟に判断・動作するインテリジェントなAIエージェントのスキルに置き換えるメリットや、npx skillsコマンドを用いた実用的なセットアップ手順を紹介します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20AI%20Agent%20Skills%20Replace%20Nuxt%20App%20Scaffolding%20Scripts\u002FJA-How-AI-Agent-Skills-Replace-Nuxt-App-Scaffolding-Scripts.webp","CloudflareでのNuxt環境構築：シェルスクリプトからAIエージェントスキルへ移行するメリット。スクリプトとAIスキルの徹底比較。",{"schemaOrg":8587,"robots":1704,"sitemap":8589},[8588],{"@type":1681,"headline":7981,"description":8583,"image":8584},{"lastmod":8582},{"title":8591,"description":8583,"ogTitle":7981,"ogDescription":8583,"twitterTitle":7981,"twitterDescription":8583},"CloudflareでのNuxt環境構築：シェルスクリプトからAIエージェントスキルへ移行するメリット","ja\u002Farticle\u002Fhow-ai-agent-skills-replace-nuxt-app-scaffolding-scripts",[8189,6249,8594,8595],"AI Agent","Scaffolding","7nQfGY7WVvKS7mUnoFrtHe97RJD_xMp8x7o_dAtuTuI",{"id":8598,"title":8599,"author":1713,"body":8600,"category":9398,"date":9400,"description":9401,"extension":1675,"image":9402,"imageAlt":9403,"isPublished":1070,"meta":9404,"minRead":9409,"navigation":1070,"path":209,"seo":9410,"stem":9411,"tags":9412,"updatedAt":1713,"__hash__":9414},"article\u002Fja\u002Farticle\u002Fuse-cloudflare-as-ai-memory.md","CloudflareとModel Context Protocolによる永続的自己ホスト型AIメモリシステム",{"type":427,"value":8601,"toc":9380},[8602,8606,8609,8612,8616,8619,8632,8636,8643,8657,8660,8663,8707,8711,8793,8797,8821,8918,8929,8933,8938,8978,9003,9007,9012,9079,9084,9088,9121,9127,9166,9170,9202,9206,9214,9218,9265,9269,9328,9330,9333,9336,9339,9343,9377],[472,8603,8605],{"id":8604},"aiエージェントにおける永続的メモリの重要性","AIエージェントにおける永続的メモリの重要性",[430,8607,8608],{},"AIアシスタントが日常生活に深く組み込まれるにつれ、私たちは「空白のコンテキスト問題（コンテキストの喪失）」に頻繁に遭遇することになります。先週下した決定は忘れ去られ、新しいセッションを開始するたびに、同じ技術スタックの仕様を入力し、ユーザー設定を何度も定義し直す必要が生じます。",[430,8610,8611],{},"毎回ゼロからやり直す代わりに、継続的に進化し、ユーザーの決定を恒常的に理解し、同じコンテキストの入力を繰り返す手間を完全に省くメモリシステムを構築する必要があります。",[472,8613,8615],{"id":8614},"自己ホスト型-vs-ビルトイン型-aiメモリシステム","自己ホスト型 vs. ビルトイン型 AIメモリシステム",[430,8617,8618],{},"多くのAIエージェントにはメモリ機能が組み込まれていますが、私たちは1つのエージェントだけですべての用を足すわけではありません。プロジェクトの設計やアーキテクチャの構築にはClaudeを、コーディングにはKimiを、背景調査にはChatGPTを使用することがあります。しかし、これらの異なるエージェント間でコンテキストは共有されず、それぞれのツール内に完全に孤立（サイロ化）したままになります。",[430,8620,8621,8622,506,8627,8631],{},"ソフトウェアエンジニアリングの観点から、私たちは不透明なブラックボックスを信頼しません。観察可能で、監査可能であり、そして完全に私たちの制御下にあるAIメモリシステムが必要です。オープンソースプロジェクトである ",[441,8623,8626],{"href":8624,"rel":8625},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare\u002Ftree\u002Fmain",[445],"Second Brain",[441,8628,8629],{"href":8629,"rel":8630},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare",[445]," のフォーク）は、Model Context Protocol（MCP）をサポートした、永続的で自己ホスト（セルフホスト）型のメモリシステムを提供します。Claude、ChatGPT、Kimi CodeなどのMCP対応AIエージェントであれば、共通の統一されたメモリコンテキストを完全に共有できます。",[472,8633,8635],{"id":8634},"cloudflare上でsecond-brain-aiメモリを構築する方法","Cloudflare上でSecond Brain AIメモリを構築する方法",[430,8637,8638,8639,8642],{},"Second Brainメモリシステムは、世界中に分散された超低レイテンシのサーバーレス実行インフラを提供する ",[448,8640,8641],{},"Cloudflare Workers"," 上に展開されます。これにより、メモリの検索（recall）や保存などの処理を、AIの推論ループ内で遅延を感じさせることなく、ほぼ瞬時に実行することができます。",[430,8644,8645,8646,8649,8650,8653,8654,8656],{},"ベクトルの生成には、",[448,8647,8648],{},"Workers AI"," の埋め込み（embedding）モデルが使用されます。生成された埋め込みベクトルは、高度に最適化され、世界中に分散配置されたベクトルデータベースである ",[448,8651,8652],{},"Cloudflare Vectorize"," に保存されます。",[448,8655,8652],{}," は、セマンティックな（意味的な）関連性を持つメモリを正確に特定するために、コサイン類似度（cosine similarity）検索を実行します。",[430,8658,8659],{},"Second Brainには、インテリジェントな重複検出とマージ（融合）メカニズムも備わっています。意味の類似度が85%未満のコンテンツは新規メモリとして保存され、それ以上の類似度を持つものは重複候補としてブロックまたはマークされます。1,600文字を超える長いテキストは、文脈の喪失を防ぐために、文の境界や改行位置で適切に分割され、隣り合うチャンク間で200文字の重複（overlap）が維持されます。分割された各チャンクはそれぞれベクトル化され、極めて精度の高いマッチングを実現します。",[430,8661,8662],{},"AIエージェントから直接呼び出して使用するために、以下のツールがMCPインターフェースとして公開されています：",[481,8664,8665,8671,8677,8683,8689,8695,8701],{},[484,8666,8667,8670],{},[491,8668,8669],{},"remember",": アイデア、決定事項、好み、プロジェクトのコンテキストを保存する",[484,8672,8673,8676],{},[491,8674,8675],{},"append",": 既存のメモリに新しい更新情報や追記を追加する",[484,8678,8679,8682],{},[491,8680,8681],{},"update",": 既存のメモリを完全に置き換える",[484,8684,8685,8688],{},[491,8686,8687],{},"recall",": 完全一致するキーワードではなく、セマンティックな意味に基づいてメモリを検索する",[484,8690,8691,8694],{},[491,8692,8693],{},"list_recent",": 最近保存されたメモリを一覧表示する",[484,8696,8697,8700],{},[491,8698,8699],{},"forget",": メモリを完全に、恒久的に削除する",[484,8702,8703,8706],{},[491,8704,8705],{},"link\u002Fconnections",": 関連するメモリ同士を明示的にリンクする（V2グラフ機能）",[885,8708,8710],{"id":8709},"cloudflareでのsecond-brainのセットアップ","CloudflareでのSecond Brainのセットアップ",[529,8712,8713,8730,8737,8744,8751,8758,8769,8776,8779,8786],{},[484,8714,8715,8720,8721,8724,8725,8729],{},[441,8716,8719],{"href":8717,"rel":8718},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fsecond-brain-cloudflare",[445],"Githubリポジトリ"," ページの ",[491,8722,8723],{},"Deploy to Cloudflare"," をクリックします。 [[",[433,8726],{"alt":8727,"src":8728},"GitHubページ上のDeploy to Cloudflareボタンのハイライト表示","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fdeploy-to-cloudflare-button.webp","]]",[484,8731,8732,8733],{},"表示されたCloudflare Workerのフォームに入力します。\n",[433,8734],{"alt":8735,"src":8736},"Cloudflare Workersのデプロイ設定フォーム画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-deployment-form.webp",[484,8738,8739,8740],{},"Dimensions（次元数）に '384' を入力し、Metric（指標）に 'cosine' を選択して、Deployボタンをクリックします。\n",[433,8741],{"alt":8742,"src":8743},"Cloudflare Vectorizeデータベース作成設定画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-vectorize-configuration.webp",[484,8745,8746,8747],{},"以下は、Cloudflare Worker内に展開されたSecond Brainの管理ダッシュボードの概要です：\n",[433,8748],{"alt":8749,"src":8750},"デプロイされたSecond Brain Workerの概要ダッシュボード","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-second-brain-overview.webp",[484,8752,8753,8754],{},"'Settings'（設定）タブをクリックし、安全なアクセスキーを作成するために 'AUTH_TOKEN' の編集アイコンをクリックします：\n",[433,8755],{"alt":8756,"src":8757},"AUTH_TOKENがハイライトされたCloudflare Workerの変数設定","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-settings.webp",[484,8759,8760,8761,8765],{},"'Rotate' リンクをクリックして、新しい値を入力できるようにします： ",[433,8762],{"alt":8763,"src":8764},"AUTH_TOKEN変数の編集およびローテーション画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-rotate.webp",[433,8766],{"alt":8767,"src":8768},"生成されたランダムな文字列をAUTH_TOKENの値フィールドに入力する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fcloudflare-worker-auth-token-value-input.webp",[484,8770,8771,8772,8775],{},"macOSのターミナルで ",[491,8773,8774],{},"openssl rand -base64 32"," コマンドを実行して安全なランダム値を生成し、それを 'Value' 入力フィールドに貼り付けます。",[484,8777,8778],{},"'Deploy' ボタンをクリックして、'AUTH_TOKEN' の新しい値を保存します。",[484,8780,8781,8782],{},"ウェブブラウザで、作成したSecond BrainのWorker URLを開きます。\n",[433,8783],{"alt":8784,"src":8785},"Bearer Token入力欄があるSecond Brain Web UIのログイン画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-login.webp",[484,8787,8788,8789,8792],{},"作成した 'AUTH_TOKEN' を ",[491,8790,8791],{},"Bearer token"," フィールドに入力し、'Connect' ボタンをクリックして管理用の Web UI にログインします。",[885,8794,8796],{"id":8795},"mcp経由でのclaude-desktopの統合","MCP経由でのClaude Desktopの統合",[529,8798,8799,8806,8813],{},[484,8800,8801,8802],{},"Claude Desktopの設定画面で 'Customize'（カスタマイズ）をクリックします。\n",[433,8803],{"alt":8804,"src":8805},"Claude Desktop画面上のCustomizeボタンの指示位置","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-customize-button.webp",[484,8807,8808,8809],{},"'Developer'（デベロッパー）をクリックして、MCPサーバーの設定ファイルをエディタで直接開きます：\n",[433,8810],{"alt":8811,"src":8812},"MCP設定にアクセスするためのClaude Desktopデベロッパー設定メニュー","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-developer-menu.webp",[484,8814,8815,3073,8818,8820],{},[491,8816,8817],{},"claude_desktop_config.json",[491,8819,7456],{}," セクションに以下のコードブロックを追加します：",[930,8822,8824],{"className":2912,"code":8823,"language":2914,"meta":425,"style":425},"    \"second-brain\": {\n      \"command\": \"npx\",\n      \"args\": [\n        \"mcp-remote\",\n        \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n        \"--header\",\n        \"Authorization: Bearer \u003Cyour-token>\"\n      ]\n    }\n",[491,8825,8826,8839,8857,8869,8879,8890,8901,8910,8914],{"__ignoreMap":425},[938,8827,8828,8830,8833,8835,8837],{"class":940,"line":941},[938,8829,7468],{"class":952},[938,8831,8832],{"class":1051},"second-brain",[938,8834,3687],{"class":952},[938,8836,7461],{"class":948},[938,8838,2921],{"class":952},[938,8840,8841,8843,8845,8847,8849,8851,8853,8855],{"class":940,"line":1067},[938,8842,7481],{"class":952},[938,8844,7484],{"class":944},[938,8846,3687],{"class":952},[938,8848,1366],{"class":952},[938,8850,3285],{"class":952},[938,8852,7493],{"class":1051},[938,8854,3687],{"class":952},[938,8856,7498],{"class":952},[938,8858,8859,8861,8863,8865,8867],{"class":940,"line":1074},[938,8860,7481],{"class":952},[938,8862,7505],{"class":944},[938,8864,3687],{"class":952},[938,8866,1366],{"class":952},[938,8868,7512],{"class":952},[938,8870,8871,8873,8875,8877],{"class":940,"line":1081},[938,8872,7517],{"class":952},[938,8874,7520],{"class":1051},[938,8876,3687],{"class":952},[938,8878,7498],{"class":952},[938,8880,8881,8883,8886,8888],{"class":940,"line":1933},[938,8882,7517],{"class":952},[938,8884,8885],{"class":1051},"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp",[938,8887,3687],{"class":952},[938,8889,7498],{"class":952},[938,8891,8892,8894,8897,8899],{"class":940,"line":1938},[938,8893,7517],{"class":952},[938,8895,8896],{"class":1051},"--header",[938,8898,3687],{"class":952},[938,8900,7498],{"class":952},[938,8902,8903,8905,8908],{"class":940,"line":1944},[938,8904,7517],{"class":952},[938,8906,8907],{"class":1051},"Authorization: Bearer \u003Cyour-token>",[938,8909,1965],{"class":952},[938,8911,8912],{"class":940,"line":2277},[938,8913,7596],{"class":952},[938,8915,8916],{"class":940,"line":2288},[938,8917,7601],{"class":952},[430,8919,8920,8924,8925],{},[433,8921],{"alt":8922,"src":8923},"Second Brainサーバーを含むClaude DesktopのMCP設定JSONファイル","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-config-json.webp","\n4. Claude Desktopを再起動し、'Local MCP servers' のリストを確認します。ステータスが 'running'（実行中）と表示されていれば成功です。\n",[433,8926],{"alt":8927,"src":8928},"Second Brain MCPサーバーが正常に実行中であることを示すClaude Desktop","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-mcp-status-running.webp",[885,8930,8932],{"id":8931},"mcp経由でのclaude-codeの統合","MCP経由でのClaude Codeの統合",[481,8934,8935],{},[484,8936,8937],{},"ターミナルで以下のコマンドを実行して、新しいMCPサーバーを追加します：",[930,8939,8941],{"className":2307,"code":8940,"language":2309,"meta":425,"style":425},"claude mcp add --transport http second-brain https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\n",[491,8942,8943],{"__ignoreMap":425},[938,8944,8945,8948,8951,8953,8956,8959,8962,8965,8967,8970,8973,8975],{"class":940,"line":941},[938,8946,8947],{"class":1047},"claude",[938,8949,8950],{"class":1051}," mcp",[938,8952,1061],{"class":1051},[938,8954,8955],{"class":1051}," --transport",[938,8957,8958],{"class":1051}," http",[938,8960,8961],{"class":1051}," second-brain",[938,8963,8964],{"class":1051}," https:\u002F\u002F",[938,8966,5563],{"class":952},[938,8968,8969],{"class":1051},"your-worker-ur",[938,8971,8972],{"class":948},"l",[938,8974,1257],{"class":952},[938,8976,8977],{"class":1051},"\u002Fmcp\n",[481,8979,8980,8987],{},[484,8981,8982,8983,8986],{},"Claude Codeはエンドポイントが認証を必要とすることを自動的に検出し、ウェブブラウザでログインページを開きます。ブラウザ上で ",[491,8984,8985],{},"AUTH_TOKEN"," を入力して認証を完了させます。",[484,8988,8989,8992,8993,8996,8997,9002],{},[491,8990,8991],{},"~\u002F.claude"," ディレクトリ内に ",[491,8994,8995],{},"CLAUDE.md"," ファイルを作成し、",[441,8998,9001],{"href":8999,"rel":9000},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fblob\u002Fmain\u002FAI_Instructions\u002FCLAUDE_INSTRUCTIONS.md",[445],"CLAUDE_INSTRUCTIONS.md"," に記載されている指示を記述しておきます。",[885,9004,9006],{"id":9005},"mcp経由でのgemini-cliの統合","MCP経由でのGemini CLIの統合",[529,9008,9009],{},[484,9010,9011],{},"以下のMCPサーバー設定を、お使いの '.\u002F.gemini\u002Fsettings.json' ファイルに追加します：",[930,9013,9015],{"className":2912,"code":9014,"language":2914,"meta":425,"style":425},"    \"second-brain\": {\n      \"httpUrl\": \"https:\u002F\u002F\u003Cyour-worker-url>\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[491,9016,9017,9029,9047,9059,9071,9075],{"__ignoreMap":425},[938,9018,9019,9021,9023,9025,9027],{"class":940,"line":941},[938,9020,7468],{"class":952},[938,9022,8832],{"class":1051},[938,9024,3687],{"class":952},[938,9026,7461],{"class":948},[938,9028,2921],{"class":952},[938,9030,9031,9033,9035,9037,9039,9041,9043,9045],{"class":940,"line":1067},[938,9032,7481],{"class":952},[938,9034,7694],{"class":944},[938,9036,3687],{"class":952},[938,9038,1366],{"class":952},[938,9040,3285],{"class":952},[938,9042,8885],{"class":1051},[938,9044,3687],{"class":952},[938,9046,7498],{"class":952},[938,9048,9049,9051,9053,9055,9057],{"class":940,"line":1074},[938,9050,7481],{"class":952},[938,9052,7713],{"class":944},[938,9054,3687],{"class":952},[938,9056,1366],{"class":952},[938,9058,2951],{"class":952},[938,9060,9061,9063,9065,9067,9069],{"class":940,"line":1081},[938,9062,7517],{"class":952},[938,9064,7726],{"class":1047},[938,9066,3687],{"class":952},[938,9068,1366],{"class":952},[938,9070,1388],{"class":952},[938,9072,9073],{"class":940,"line":1933},[938,9074,7737],{"class":952},[938,9076,9077],{"class":940,"line":1938},[938,9078,7601],{"class":952},[529,9080,9081],{"start":1067},[484,9082,9083],{},"Gemini CLIを起動します。",[885,9085,9087],{"id":9086},"aiエージェントでのsecond-brainのテスト","AIエージェントでのSecond Brainのテスト",[529,9089,9090,9100,9114],{},[484,9091,9092,9095,9096],{},[448,9093,9094],{},"Claude Desktop"," 上で、簡単なブランドのカラーパレット設定を指示してみます。初期状態では、Second Brainは呼び出されません。\n",[433,9097],{"alt":9098,"src":9099},"Second Brainメモリ層が有効になっていない状態でのClaude Desktopでの最初のテスト","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-first-run-brand-palette.webp",[484,9101,9102,9103,9105,9106,9109,9110],{},"単に 'remember' という言葉を使ってみても、",[448,9104,9094],{}," のローカルビルトインツールである ",[491,9107,9108],{},"memory_user-edits"," のみが実行され、リモートのSecond Brainメモリ層は無視されます。\n",[433,9111],{"alt":9112,"src":9113},"Second Brainではなくローカルの組み込みツールにフォールバックするClaude Desktop","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-remember-built-in-tool-fallback.webp",[484,9115,9116,9117,9120],{},"次に、",[448,9118,9119],{},"Claude Code"," 上で以下のプロンプトを入力して送信すると、Second Brainが正しく呼び出されます：",[930,9122,9125],{"className":9123,"code":9124,"language":4636},[4634],"Remember Our brand palette uses `#1a1a2e` as primary, `#16213e` as secondary, and `#e94560` as accent. Never use pure black.\"\n",[491,9126,9124],{"__ignoreMap":425},[430,9128,9129,9133,9134,9137,9138,9142,9143,9146,9147,9149,9150,9154,9155,9158,9159,9142,9163],{},[433,9130],{"alt":9131,"src":9132},"Second Brain MCPの正常なトリガーを示すClaude Codeのターミナル画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-code-second-brain-mcp-called.webp","\n4. ",[448,9135,9136],{},"Cloudflare上のSecond Brain"," ダッシュボードを開き、新しいカラー設定が保存されていることを確認します：\n",[433,9139],{"alt":9140,"src":9141},"Second Brain Web UIで保存されたブランドカラーコードのデータを確認する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-color-verification.webp","\n- ",[905,9144,9145],{},"Claude Codeがシームレスに機能したのは、プロジェクトフォルダ内の CLAUDE_INSTRUCTIONS.md に 'Second Brain' に関連するトリガー指示が含まれていたためです。","\n5. ",[448,9148,9094],{}," でも同様に機能させるには、プロンプトの中で 'Second Brain' という言葉を明示的に含めて、この永続メモリ層への保存または読み込みを強制する必要があります。\n",[433,9151],{"alt":9152,"src":9153},"キーワードを明示的に指定してClaude DesktopでSecond Brainをトリガーする様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fclaude-desktop-second-brain-explicit-trigger.webp","\n6. ",[448,9156,9157],{},"Gemini CLI"," も同様で、Second Brain MCPをトリガーするために、プロンプト内で 'Second Brain' に言及する必要があります。\n",[433,9160],{"alt":9161,"src":9162},"Second Brain MCPの正常な呼び出しを示すGemini CLIのターミナル画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fgemini-cli-second-brain-trigger.webp",[905,9164,9165],{},"CLAUDE_INSTRUCTIONS.md と同じように、お使いの GEMINI.md ファイルに類似の指示を追加しておくことで、プロンプトでキーワードを意識して入力しなくても、背後で自動的にSecond Brainがトリガーされるようになります。",[885,9167,9169],{"id":9168},"webブラウザ拡張機能","Webブラウザ拡張機能",[481,9171,9172,9175],{},[484,9173,9174],{},"Google Chrome、Mozilla Firefox、および Microsoft Edge 向けに公式拡張機能が提供されています。",[484,9176,9177,9178],{},"拡張機能では以下の操作が可能です：\n",[481,9179,9180,9186,9192],{},[484,9181,9182,9185],{},[448,9183,9184],{},"現在のページをキャプチャする"," — 表示中のページのタイトルとURLをSecond Brainに即座に保存します。",[484,9187,9188,9191],{},[448,9189,9190],{},"選択したテキストをキャプチャする"," — ページ上の任意のテキストをドラッグ選択してから拡張機能アイコンをクリックすると、その抜粋がページのタイトルとURLとともに保存されます。",[484,9193,9194,9197,9198,9201],{},[448,9195,9196],{},"クイックメモを追加する"," — 保存する前に、拡張機能のポップアップ内に直接メモを入力したり、",[491,9199,9200],{},"#hashtags"," を割り当てたりできます。ハッシュタグは自動的にメタデータタグとして抽出されます。",[885,9203,9205],{"id":9204},"obsidianプラグインによる個人知識の同期","Obsidianプラグインによる個人知識の同期",[481,9207,9208,9211],{},[484,9209,9210],{},"ローカルの Obsidian Vault 内のノートを、Cloudflare上のSecond Brainと直接、選択的に同期するための専用プラグインが提供されています。",[484,9212,9213],{},"特定のノートに特定のタグを追加するだけで、その内容が永続ベクトルストレージに同期されます。",[2166,9215,9217],{"id":9216},"obsidianプラグインのインストール","Obsidianプラグインのインストール",[529,9219,9220,9235,9245,9252],{},[484,9221,9222,9223,9226,9227,9230,9231],{},"Obsidianを起動し、",[938,9224,9225],{},"Settings（設定）"," → ",[938,9228,9229],{},"Community Plugins（コミュニティプラグイン）"," を開きます。\n",[433,9232],{"alt":9233,"src":9234},"Community Plugins（コミュニティプラグイン）セクションへ遷移するObsidianの設定画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-settings-community-plugins.webp",[484,9236,9237,9240,9241],{},[938,9238,9239],{},"Browse（閲覧）"," ボタンをクリックします。\n",[433,9242],{"alt":9243,"src":9244},"Browse（閲覧）ボタンが表示されたObsidianのコミュニティプラグイン検索画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-browse.webp",[484,9246,9247,9248],{},"'Second Brain Sync' を検索します。\n",[433,9249],{"alt":9250,"src":9251},"Obsidianプラグインストアで「Second Brain Sync」プラグインを検索する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-community-plugins-search-second-brain.webp",[484,9253,9254,9257,9258,9240,9261],{},[938,9255,9256],{},"Install（インストール）"," ボタンをクリックし、続いて ",[938,9259,9260],{},"Enable（有効化）",[433,9262],{"alt":9263,"src":9264},"Obsidianで「Second Brain Sync」プラグインをインストールして有効化する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-install-and-enable.webp",[2166,9266,9268],{"id":9267},"obsidianプラグインの設定","Obsidianプラグインの設定",[529,9270,9271,9279,9286,9296,9311,9321],{},[484,9272,9273,9226,9275,9278],{},[938,9274,9225],{},[938,9276,9277],{},"Second Brain Sync"," を開きます。",[484,9280,9281,9282],{},"作成したWorkerの「URL」と「Auth token（認証トークン）」を入力します。\n",[433,9283],{"alt":9284,"src":9285},"Obsidianプラグイン設定画面でWorkerのURLと認証トークンを入力する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-configuration-credentials.webp",[484,9287,9288,9291,9292],{},[938,9289,9290],{},"Test"," ボタンをクリックし、接続が正常に確立されていることを検証します。\n",[433,9293],{"alt":9294,"src":9295},"Obsidianプラグインの接続テストが正常に成功したことを示すダイアログ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-connection-test-success.webp",[484,9297,9298,9299,9302,9303,9306,9307],{},"同期動作を設定します。",[938,9300,9301],{},"Sync tag"," に同期対象ノートを判別するタグ名を設定し、",[938,9304,9305],{},"Auto-sync on save（保存時に自動同期）"," を有効にします。\n",[433,9308],{"alt":9309,"src":9310},"Obsidianプラグイン設定で同期タグ（Sync tag）を設定し、保存時の自動同期を有効化する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-plugin-sync-behavior-settings.webp",[484,9312,9313,9314,9316,9317],{},"Obsidianのノート内に、設定した同期用タグ（例： ",[491,9315,8832],{},"）を記述して保存します。\n",[433,9318],{"alt":9319,"src":9320},"同期用タグ「second-brain」を付与した新規Obsidianノートの作成画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fobsidian-note-with-sync-tag.webp",[484,9322,9323,9324],{},"保存されたノートは、即座にCloudflare上に展開されたSecond Brainへ自動同期されます。\n",[433,9325],{"alt":9326,"src":9327},"同期が成功したObsidianのノートをSecond Brain Web UI側で確認する様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002Fsecond-brain-web-ui-synced-note-verification.webp",[472,9329,2576],{"id":2576},[430,9331,9332],{},"Second Brainは、現在のAIエージェントにおける最大の難題の一つである「コンテキストの喪失とメモリの欠如」に対する、洗練されたオープンソースの解法を提供します。このプロジェクトをCloudflareの拡張性の高いサーバーレスインフラと融合させることで、グローバルに分散され、極めて遅延の少ない、完全に自己ホストされたセマンティックメモリレイヤーを手にすることができます。さらにModel Context Protocol（MCP）規格に準拠しているため、この知識ベースは多様なAIアシスタント間で完全にポータブル（移植可能）です。",[430,9334,9335],{},"Obsidianプラグインの存在は、このアーキテクチャを個人の知識管理と推論ループを橋渡しするものへと昇華させます。ユーザーの散らばった個人ノートが、AIエージェントがいつでも意味的に解釈・呼び出し可能な構造化された文脈データへと進化します。",[430,9337,9338],{},"自己ホスト型アプローチ、セマンティックベクトル検索、そしてMCPのようなオープンな標準規格を高度に融合させることで、Second Brainは単なる情報置き場を超え、真の意味で実用的な独自の「AIアシスタントエコシステム」を構築するための強固な設計基盤であることを証明しています。",[472,9340,9342],{"id":9341},"参考文献","参考文献：",[481,9344,9345,9351,9357,9364,9371],{},[484,9346,9347],{},[441,9348,9349],{"href":9349,"rel":9350},"https:\u002F\u002Fwww.thesecondbrain.dev\u002F",[445],[484,9352,9353],{},[441,9354,9355],{"href":9355,"rel":9356},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FHow-It-Works",[445],[484,9358,9359],{},[441,9360,9363],{"href":9361,"rel":9362},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FConnect-to-AI-Clients",[445],"Connect to AI Clients",[484,9365,9366],{},[441,9367,9370],{"href":9368,"rel":9369},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-cloudflare\u002Fwiki\u002FObsidian-Plugin",[445],"Second Brain Obsidian Plugin",[484,9372,9373],{},[441,9374,9375],{"href":9375,"rel":9376},"https:\u002F\u002Fgithub.com\u002Frahilp\u002Fsecond-brain-obsidian-plugin",[445],[1650,9378,9379],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":425,"searchDepth":1067,"depth":1074,"links":9381},[9382,9383,9384,9396,9397],{"id":8604,"depth":1067,"text":8605},{"id":8614,"depth":1067,"text":8615},{"id":8634,"depth":1067,"text":8635,"children":9385},[9386,9387,9388,9389,9390,9391,9392],{"id":8709,"depth":1074,"text":8710},{"id":8795,"depth":1074,"text":8796},{"id":8931,"depth":1074,"text":8932},{"id":9005,"depth":1074,"text":9006},{"id":9086,"depth":1074,"text":9087},{"id":9168,"depth":1074,"text":9169},{"id":9204,"depth":1074,"text":9205,"children":9393},[9394,9395],{"id":9216,"depth":1081,"text":9217},{"id":9267,"depth":1081,"text":9268},{"id":2576,"depth":1067,"text":2576},{"id":9341,"depth":1067,"text":9342},[9399,1670],"cloudflare","2026-08-07","CloudflareとSecond Brain、MCPを使用して、永続的で自己ホスト型のAIメモリシステムを構築する方法を学びます。ClaudeやGemini、Obsidianでコンテキストを共有しましょう。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Cloudflare%20as%20AI%20memory\u002FJA-Use-Cloudflare-as-AI-memory.webp","Cloudflare WorkersとVectorize上に構築された永続的な自己ホスト型AIメモリシステム。MCPとObsidian同期に対応。",{"schemaOrg":9405,"robots":1704,"sitemap":9408},[9406],{"@type":1681,"headline":9407,"description":9401},"Cloudflare & MCPによる自己ホスト型永続AIメモリシステム",{"lastmod":9400},38,{"title":9407,"description":9401,"ogTitle":8599,"ogDescription":9401,"twitterTitle":8599,"twitterDescription":9401},"ja\u002Farticle\u002Fuse-cloudflare-as-ai-memory",[6249,7977,9413,8626,4089],"AIメモリ","9x3FSkJZh6hcgPg0GymRv7yWTVgQ-1XCvzT_j98Vvqo",{"id":9416,"title":2524,"author":425,"body":9417,"category":9927,"date":9928,"description":9929,"extension":1675,"image":9930,"imageAlt":9931,"isPublished":1070,"meta":9932,"minRead":1067,"navigation":1070,"path":201,"seo":9936,"stem":9937,"tags":9938,"updatedAt":1713,"__hash__":9941},"article\u002Fja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac.md",{"type":427,"value":9418,"toc":9920},[9419,9423,9426,9432,9436,9439,9442,9445,9449,9452,9459,9475,9768,9880,9882,9885,9887,9917],[472,9420,9422],{"id":9421},"cloudflare-warpとは","Cloudflare WARPとは？",[430,9424,9425],{},"Cloudflare WARPは、指定されたデバイスのトラフィックをパブリックインターネットに直接送信する代わりに、Cloudflareのグローバルネットワーク経由でルーティングするクライアント側アプリケーションです。",[430,9427,9428,9431],{},[448,9429,9430],{},"WireGuard","プロトコルに基づいて構築された暗号化トンネルを作成し、デバイスから最も近いCloudflareデータセンターへの通信を保護します。その後、Cloudflareダッシュボードでポリシーを作成し、この受信トラフィックをフィルタリング、ログ記録、検査、またはルーティングできます。",[472,9433,9435],{"id":9434},"なぜcloudflare-warpが必要なのか","なぜCloudflare WARPが必要なのか？",[430,9437,9438],{},"社内WebサービスやSaaSアプリケーションなどの内部リソースを、従業員、契約社員、その他のステークホルダーに安全に公開するため、Cloudflare WARPクライアントは**Zero Trust Network Access (ZTNA)**のクライアント側セキュリティ適用ポイントとして機能します。",[430,9440,9441],{},"Cloudflare WARPクライアントは、ユーザーのノートPCやスマートフォンにインストールされます。アクセスを許可する前に、ユーザーが認証され、特定のセキュリティ健全性チェック（承認されたIP範囲からのアクセス、登録されたメールドメインの使用、アクティブなファイアウォールの実行など）を満たすことを要求します。",[430,9443,9444],{},"デバイストラフィックをCloudflareに直接トンネリングすることで、リクエストが内部リソースに到達する前に、ユーザーのID、デバイス、およびポリシーが検証されます。その結果、内部リソースがパブリックインターネットに公開されることはなく、すべてのリクエストが完全にログ記録および監査されます。",[472,9446,9448],{"id":9447},"_1台のデバイスで複数のwarpプロファイルをサポートする","1台のデバイスで複数のWARPプロファイルをサポートする",[430,9450,9451],{},"ユーザーが個人用と企業用のCloudflareアカウントを切り替える必要がある場合や、システム管理者が複数のテナントを管理する場合、単一のデバイスで複数のWARPプロファイルをサポートすることが極めて重要になります。",[430,9453,9454,9455,9458],{},"macOSでこれを実現するために、",[491,9456,9457],{},".mobileconfig"," MDMプロファイルファイルを使用して、異なるWARP環境を定義および登録できます。",[481,9460,9461,9472],{},[484,9462,9463,9464,9471],{},"Cloudflareから直接 ",[441,9465,9468,9470],{"href":9466,"rel":9467},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fstatic\u002Fmdm\u002Fmultiple-orgs\u002FCloudflareWARP.mobileconfig",[445],[491,9469,9457],{},"ファイルのサンプルをダウンロード"," します。",[484,9473,9474],{},"以下は、この設定がどのようなものかを示す例です：",[930,9476,9480],{"className":9477,"code":9478,"language":9479,"meta":425,"style":425},"language-xml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n  \u003Ckey>PayloadContent\u003C\u002Fkey>\n  \u003Carray>\n    \u003Cdict>\n      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n      \u003Ckey>PayloadType\u003C\u002Fkey>\n      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n      \u003Cinteger>1\u003C\u002Finteger>\n      \u003Ckey>configs\u003C\u002Fkey>\n      \u003Carray>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 1\u003C\u002Fstring>\n        \u003C\u002Fdict>\n        \u003Cdict>\n          \u003Ckey>organization\u003C\u002Fkey>\n          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n          \u003Ckey>display_name\u003C\u002Fkey>\n          \u003Cstring>Team 2\u003C\u002Fstring>\n        \u003C\u002Fdict>\n      \u003C\u002Farray>\n    \u003C\u002Fdict>\n  \u003C\u002Farray>\n  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n  \u003Cfalse\u002F>\n  \u003Ckey>PayloadScope\u003C\u002Fkey>\n  \u003Cstring>System\u003C\u002Fstring>\n  \u003Ckey>PayloadType\u003C\u002Fkey>\n  \u003Cstring>Configuration\u003C\u002Fstring>\n  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n  \u003Cinteger>1\u003C\u002Finteger>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n","xml",[491,9481,9482,9487,9492,9497,9502,9507,9512,9517,9522,9527,9532,9537,9542,9547,9552,9557,9562,9567,9572,9577,9582,9587,9592,9597,9602,9607,9612,9617,9621,9625,9630,9634,9639,9643,9649,9655,9661,9667,9672,9678,9684,9690,9696,9702,9708,9714,9720,9726,9732,9738,9744,9750,9756,9762],{"__ignoreMap":425},[938,9483,9484],{"class":940,"line":941},[938,9485,9486],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[938,9488,9489],{"class":940,"line":1067},[938,9490,9491],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[938,9493,9494],{"class":940,"line":1074},[938,9495,9496],{},"\u003Cplist version=\"1.0\">\n",[938,9498,9499],{"class":940,"line":1081},[938,9500,9501],{},"\u003Cdict>\n",[938,9503,9504],{"class":940,"line":1933},[938,9505,9506],{},"  \u003Ckey>PayloadContent\u003C\u002Fkey>\n",[938,9508,9509],{"class":940,"line":1938},[938,9510,9511],{},"  \u003Carray>\n",[938,9513,9514],{"class":940,"line":1944},[938,9515,9516],{},"    \u003Cdict>\n",[938,9518,9519],{"class":940,"line":2277},[938,9520,9521],{},"      \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[938,9523,9524],{"class":940,"line":2288},[938,9525,9526],{},"      \u003Cstring>Warp Configuration\u003C\u002Fstring>\n",[938,9528,9529],{"class":940,"line":2384},[938,9530,9531],{},"      \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[938,9533,9534],{"class":940,"line":2390},[938,9535,9536],{},"      \u003Cstring>com.cloudflare.warp.CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[938,9538,9539],{"class":940,"line":2396},[938,9540,9541],{},"      \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[938,9543,9544],{"class":940,"line":2401},[938,9545,9546],{},"      \u003Cstring>Cloudflare Ltd.\u003C\u002Fstring>\n",[938,9548,9549],{"class":940,"line":2407},[938,9550,9551],{},"      \u003Ckey>PayloadType\u003C\u002Fkey>\n",[938,9553,9554],{"class":940,"line":1706},[938,9555,9556],{},"      \u003Cstring>com.cloudflare.warp\u003C\u002Fstring>\n",[938,9558,9559],{"class":940,"line":3364},[938,9560,9561],{},"      \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[938,9563,9564],{"class":940,"line":3369},[938,9565,9566],{},"      \u003Cstring>CB8B22D4-50E1-48E8-8874-A7594627013A\u003C\u002Fstring>\n",[938,9568,9569],{"class":940,"line":3377},[938,9570,9571],{},"      \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[938,9573,9574],{"class":940,"line":3901},[938,9575,9576],{},"      \u003Cinteger>1\u003C\u002Finteger>\n",[938,9578,9579],{"class":940,"line":3907},[938,9580,9581],{},"      \u003Ckey>configs\u003C\u002Fkey>\n",[938,9583,9584],{"class":940,"line":3916},[938,9585,9586],{},"      \u003Carray>\n",[938,9588,9589],{"class":940,"line":4567},[938,9590,9591],{},"        \u003Cdict>\n",[938,9593,9594],{"class":940,"line":5017},[938,9595,9596],{},"          \u003Ckey>organization\u003C\u002Fkey>\n",[938,9598,9599],{"class":940,"line":5026},[938,9600,9601],{},"          \u003Cstring>your-team-name-1\u003C\u002Fstring>\n",[938,9603,9604],{"class":940,"line":5034},[938,9605,9606],{},"          \u003Ckey>display_name\u003C\u002Fkey>\n",[938,9608,9609],{"class":940,"line":5042},[938,9610,9611],{},"          \u003Cstring>Team 1\u003C\u002Fstring>\n",[938,9613,9614],{"class":940,"line":5047},[938,9615,9616],{},"        \u003C\u002Fdict>\n",[938,9618,9619],{"class":940,"line":5054},[938,9620,9591],{},[938,9622,9623],{"class":940,"line":5062},[938,9624,9596],{},[938,9626,9627],{"class":940,"line":5070},[938,9628,9629],{},"          \u003Cstring>your-team-name-2\u003C\u002Fstring>\n",[938,9631,9632],{"class":940,"line":5081},[938,9633,9606],{},[938,9635,9636],{"class":940,"line":5089},[938,9637,9638],{},"          \u003Cstring>Team 2\u003C\u002Fstring>\n",[938,9640,9641],{"class":940,"line":5096},[938,9642,9616],{},[938,9644,9646],{"class":940,"line":9645},34,[938,9647,9648],{},"      \u003C\u002Farray>\n",[938,9650,9652],{"class":940,"line":9651},35,[938,9653,9654],{},"    \u003C\u002Fdict>\n",[938,9656,9658],{"class":940,"line":9657},36,[938,9659,9660],{},"  \u003C\u002Farray>\n",[938,9662,9664],{"class":940,"line":9663},37,[938,9665,9666],{},"  \u003Ckey>PayloadDisplayName\u003C\u002Fkey>\n",[938,9668,9669],{"class":940,"line":9409},[938,9670,9671],{},"  \u003Cstring>Cloudflare WARP\u003C\u002Fstring>\n",[938,9673,9675],{"class":940,"line":9674},39,[938,9676,9677],{},"  \u003Ckey>PayloadIdentifier\u003C\u002Fkey>\n",[938,9679,9681],{"class":940,"line":9680},40,[938,9682,9683],{},"  \u003Cstring>cloudflare_warp\u003C\u002Fstring>\n",[938,9685,9687],{"class":940,"line":9686},41,[938,9688,9689],{},"  \u003Ckey>PayloadOrganization\u003C\u002Fkey>\n",[938,9691,9693],{"class":940,"line":9692},42,[938,9694,9695],{},"  \u003Cstring>Cloudflare, Ltd.\u003C\u002Fstring>\n",[938,9697,9699],{"class":940,"line":9698},43,[938,9700,9701],{},"  \u003Ckey>PayloadRemovalDisallowed\u003C\u002Fkey>\n",[938,9703,9705],{"class":940,"line":9704},44,[938,9706,9707],{},"  \u003Cfalse\u002F>\n",[938,9709,9711],{"class":940,"line":9710},45,[938,9712,9713],{},"  \u003Ckey>PayloadScope\u003C\u002Fkey>\n",[938,9715,9717],{"class":940,"line":9716},46,[938,9718,9719],{},"  \u003Cstring>System\u003C\u002Fstring>\n",[938,9721,9723],{"class":940,"line":9722},47,[938,9724,9725],{},"  \u003Ckey>PayloadType\u003C\u002Fkey>\n",[938,9727,9729],{"class":940,"line":9728},48,[938,9730,9731],{},"  \u003Cstring>Configuration\u003C\u002Fstring>\n",[938,9733,9735],{"class":940,"line":9734},49,[938,9736,9737],{},"  \u003Ckey>PayloadUUID\u003C\u002Fkey>\n",[938,9739,9741],{"class":940,"line":9740},50,[938,9742,9743],{},"  \u003Cstring>2B7763B8-64F6-41EB-AA5E-7761651B8131\u003C\u002Fstring>\n",[938,9745,9747],{"class":940,"line":9746},51,[938,9748,9749],{},"  \u003Ckey>PayloadVersion\u003C\u002Fkey>\n",[938,9751,9753],{"class":940,"line":9752},52,[938,9754,9755],{},"  \u003Cinteger>1\u003C\u002Finteger>\n",[938,9757,9759],{"class":940,"line":9758},53,[938,9760,9761],{},"\u003C\u002Fdict>\n",[938,9763,9765],{"class":940,"line":9764},54,[938,9766,9767],{},"\u003C\u002Fplist>\n",[481,9769,9770,9779,9792,9802,9808,9825,9837,9856,9871],{},[484,9771,9772,1842,9775,9778],{},[491,9773,9774],{},"your-team-name-1",[491,9776,9777],{},"your-team-name-2"," を、それぞれのCloudflare Zero Trustチーム名に置き換えます。",[484,9780,1849,9781,9784,9785,9787,9788,9791],{},[491,9782,9783],{},"uuidgen"," コマンドを実行してユニークなUUIDを生成し、それらを使用して ",[491,9786,9457],{}," ファイル内のプレースホルダー ",[491,9789,9790],{},"PayloadUUID"," 値を置き換えます。",[484,9793,9794,9795,9798,9799,9801],{},"プロファイルが一意に保たれるよう、",[491,9796,9797],{},"PayloadIdentifier"," 文字列にも更新された ",[491,9800,9790],{}," が含まれていることを確認してください。",[484,9803,9804,9805,9807],{},"編集した ",[491,9806,9457],{}," ファイルを保存します。",[484,9809,9810,9811,9814,9815,9818,9819,9821],{},"Macで ",[448,9812,9813],{},"システム設定"," を開き、",[448,9816,9817],{},"プロファイル"," を検索して選択します。",[1889,9820],{},[433,9822],{"alt":9823,"src":9824},"macOSシステム設定のプロファイル画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-system-settings-profiles.webp",[484,9826,9827,9830,9831,9833],{},[448,9828,9829],{},"インストール、表示、または削除..."," をクリックして、新しい構成プロファイルの追加を開始します。",[1889,9832],{},[433,9834],{"alt":9835,"src":9836},"macOSプロファイルのインストール・表示・削除ボタン","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-view-remove.webp",[484,9838,9839,9840,9842,9843,9845,9846,9848,9852],{},"左下隅にある ",[448,9841,721],{},"（プラス）アイコンをクリックし、保存した ",[491,9844,9457],{}," ファイルを選択します。",[1889,9847],{},[433,9849],{"alt":9850,"src":9851},"新しいプロファイルを追加するmacOSプロファイルのプラス（+）ボタン","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-profiles-add-profile.webp",[433,9853],{"alt":9854,"src":9855},"macOSで.mobileconfigファイルを選択する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-select-mobileconfig-file.webp",[484,9857,9858,9860,9861,9864,9865,9867],{},[448,9859,1729],{}," を選択し、",[448,9862,9863],{},"インストール"," をクリックして設定を適用します。",[1889,9866],{},[433,9868],{"alt":9869,"src":9870},"macOSでCloudflare WARPプロファイルのインストールを確認する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fmacos-install-cloudflare-warp-profile.webp",[484,9872,9873,9874,9876],{},"Cloudflare WARPクライアントを再起動します。ユーザーインターフェースにマルチプロファイル切り替えメニューが表示されるはずです：",[1889,9875],{},[433,9877],{"alt":9878,"src":9879},"macOS上の複数プロファイル切り替え機能付きCloudflare WARPクライアント","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002Fcloudflare-warp-multi-profile-switcher.webp",[472,9881,6149],{"id":6149},[430,9883,9884],{},"Cloudflare WARPクライアントはユーザーデバイス上の重要なセキュリティ境界として機能し、Zero Trust Network Access（ZTNA）を堅牢かつ実用的なものにします。内部リソースをパブリックインターネットから分離し続けることで、すべての接続試行が安全に認証、評価、および監査されます。",[472,9886,6155],{"id":6155},[481,9888,9889,9896,9903,9910],{},[484,9890,9891],{},[441,9892,9895],{"href":9893,"rel":9894},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002F#prepare-file-for-mdm-deployment",[445],"Managed Deployment Preparation",[484,9897,9898],{},[441,9899,9902],{"href":9900,"rel":9901},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002Fdeployment\u002Fmdm-deployment\u002Fswitch-organizations\u002F",[445],"Switch Between Zero Trust Organizations",[484,9904,9905],{},[441,9906,9909],{"href":9907,"rel":9908},"https:\u002F\u002Fblog.cloudflare.com\u002Fintroducing-warp-connector-paving-the-path-to-any-to-any-connectivity-2\u002F",[445],"Introducing WARP Connector: Paving the Path to Any-to-Any Connectivity",[484,9911,9912],{},[441,9913,9916],{"href":9914,"rel":9915},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fcloudflare-one\u002Fteam-and-resources\u002Fdevices\u002Fcloudflare-one-client\u002F",[445],"Cloudflare One Client Documentation",[1650,9918,9919],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1067,"depth":1074,"links":9921},[9922,9923,9924,9925,9926],{"id":9421,"depth":1067,"text":9422},{"id":9434,"depth":1067,"text":9435},{"id":9447,"depth":1067,"text":9448},{"id":6149,"depth":1067,"text":6149},{"id":6155,"depth":1067,"text":6155},[2609,9399],"2026-07-04","Macで.mobileconfigファイルを用いて、複数のCloudflare WARP組織環境を設定し、ユーザーUI上で簡単に切り替える方法をステップバイステップで分かりやすく解説します。システム管理者向けに、MDM構成プロファイルの作成、インストール、切り替え動作確認まで網羅した完全な実践設定ガイドです。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSwitch%20Between%20Multiple%20Cloudflare%20WARP%20Orgs%20on%20Mac\u002FJA-Switch-Between-Multiple-Cloudflare-WARP-Orgs-on-Mac.webp","Macで複数のCloudflare WARP組織を切り替える設定手順",{"schemaOrg":9933,"robots":1704,"sitemap":9935},[9934],{"@type":1683,"headline":2524,"description":9929},{"lastmod":9928},{"title":9931,"description":9929,"ogTitle":2524,"ogDescription":9929,"twitterTitle":2524,"twitterDescription":9929},"ja\u002Farticle\u002Fswitch-between-multiple-cloudflare-warp-orgs-on-mac",[9939,1729,9940,2652],"macOS","MDM","ybGveqjdhzREK92fqRUTTaL4gPz_r6KraZIW2UrslwI",{"id":9943,"title":8164,"author":425,"body":9944,"category":10315,"date":10316,"description":10317,"extension":1675,"image":10318,"imageAlt":10319,"isPublished":1070,"meta":10320,"minRead":1067,"navigation":1070,"path":181,"seo":10324,"stem":10325,"tags":10326,"updatedAt":1713,"__hash__":10329},"article\u002Fja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them.md",{"type":427,"value":9945,"toc":10305},[9946,9950,9960,9971,10032,10037,10041,10044,10053,10059,10063,10118,10129,10135,10138,10195,10199,10202,10209,10212,10223,10227,10271,10274,10290,10292,10299,10302],[472,9947,9949],{"id":9948},"aiエージェントのスキルagent-skillとは","AIエージェントのスキル（Agent Skill）とは？",[430,9951,9952,9953,9956,9957,9959],{},"エージェントのスキル（agent skill）とは、再利用可能な ",[448,9954,9955],{},"指示（インストラクション）のセット","、すなわち、エージェントに特定のタスクを高いクオリティで実行させるための「標準化された手順書」です。これは ",[491,9958,8157],{}," という単一の Markdown ファイルで構成され、タスクに必要なその他のファイル（参照ドキュメント、テンプレート、実行可能なスクリプトなど）をひとまとめにパッケージ化することができます。",[430,9961,9962,9963,9970],{},"例として、計画や設計を問い詰めるスキルである ",[441,9964,9967],{"href":9965,"rel":9966},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002F733d312884b3878a9a9cff693c5886943753a741\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[445],[491,9968,9969],{},"grill-me"," を見てみましょう：",[930,9972,9974],{"className":2209,"code":9973,"language":2211,"meta":425,"style":425},"---\nname: grill-me\ndescription: Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n---\n\nInterview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n\nAsk the questions one at a time.\n\nIf a question can be answered by exploring the codebase, explore the codebase instead.\n",[491,9975,9976,9981,9991,10001,10005,10009,10014,10018,10023,10027],{"__ignoreMap":425},[938,9977,9978],{"class":940,"line":941},[938,9979,9980],{"class":1047},"---\n",[938,9982,9983,9986,9988],{"class":940,"line":1067},[938,9984,9985],{"class":1362},"name",[938,9987,1366],{"class":952},[938,9989,9990],{"class":1051}," grill-me\n",[938,9992,9993,9996,9998],{"class":940,"line":1074},[938,9994,9995],{"class":1362},"description",[938,9997,1366],{"class":952},[938,9999,10000],{"class":1051}," Interview the user relentlessly about a plan or design until reaching shared understanding, resolving each branch of the decision tree. Use when user wants to stress-test a plan, get grilled on their design, or mentions \"grill me\".\n",[938,10002,10003],{"class":940,"line":1081},[938,10004,9980],{"class":1047},[938,10006,10007],{"class":940,"line":1933},[938,10008,1071],{"emptyLinePlaceholder":1070},[938,10010,10011],{"class":940,"line":1938},[938,10012,10013],{"class":1051},"Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer.\n",[938,10015,10016],{"class":940,"line":1944},[938,10017,1071],{"emptyLinePlaceholder":1070},[938,10019,10020],{"class":940,"line":2277},[938,10021,10022],{"class":1051},"Ask the questions one at a time.\n",[938,10024,10025],{"class":940,"line":2288},[938,10026,1071],{"emptyLinePlaceholder":1070},[938,10028,10029],{"class":940,"line":2384},[938,10030,10031],{"class":1051},"If a question can be answered by exploring the codebase, explore the codebase instead.\n",[430,10033,10034,10036],{},[491,10035,8157],{}," ファイルには、少量のメタデータブロックと、指示の本文が含まれています。メタデータにはスキルの名前（name）と説明（description）が記述されており、AI エージェントは起動時にこれを読み込みます。",[472,10038,10040],{"id":10039},"aiエージェントのスキルはどう機能するか段階的開示progressive-disclosure","AIエージェントのスキルはどう機能するか：段階的開示（Progressive Disclosure）",[430,10042,10043],{},"初期状態では、スキルの名前と説明だけがコンテキスト（Context）に読み込まれます。ユーザーの要求がスキルの説明文と一致したときに初めて、指示の本文全体が同じコンテキストに読み込まれます。",[430,10045,10046,10047,10052],{},"実際の開発フローにおいて、この ",[441,10048,10050],{"href":9965,"rel":10049},[445],[491,10051,9969],{}," スキルがどのように使われるかを見てみましょう。",[430,10054,10055],{},[433,10056],{"alt":10057,"src":10058},"AIエージェントスキルの実行における段階的開示（プログレッシブ・ディスクロージャー）メカニズムを示すシーケンス図","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-progressive-disclosure-sequence-diagram.webp",[885,10060,10062],{"id":10061},"ステップバイステップ","ステップ・バイ・ステップ",[529,10064,10065,10071,10077,10083,10089,10102,10112],{},[484,10066,10067,10070],{},[448,10068,10069],{},"リクエスト（Request）"," — ユーザーがエージェントに「私のワークフローの設計を問い詰めて、ストレステストしてほしい（grill me on my workflow design）」と依頼します。",[484,10072,10073,10076],{},[448,10074,10075],{},"選択用プロンプト（Selection prompt）"," — ユーザーのリクエストと、利用可能なすべてのスキルの説明文が LLM に送信されます。",[484,10078,10079,10082],{},[448,10080,10081],{},"LLM による選択"," — LLM がリクエストと各スキルの説明を比較し、一致するスキルを選択して返します。",[484,10084,10085,10088],{},[448,10086,10087],{},"確認（Confirmation）"," — エージェントが提案されたスキルをユーザーに提示し、ユーザーがそれを確認（または却下・調整）します。",[484,10090,10091,10094,10095,10098,10099,10101],{},[448,10092,10093],{},"指示のロード"," — エージェントは、確認されたスキルの ",[905,10096,10097],{},"完全な"," 指示（",[491,10100,8157],{}," の本文）を取得します。",[484,10103,10104,10107,10108,10111],{},[448,10105,10106],{},"実行用プロンプト（Execution prompt）"," — ユーザーのリクエストに、",[448,10109,10110],{},"選択されたスキルの具体的な指示","を加えたものが LLM に送信されます。",[484,10113,10114,10117],{},[448,10115,10116],{},"レスポンス"," — LLM が、問い詰めのための最初の質問を出力します。",[430,10119,10120,10121,10128],{},"次に、参照ドキュメントを持つスキルがどのように使われるかを、",[441,10122,10125],{"href":10123,"rel":10124},"https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[445],[491,10126,10127],{},"excalidraw-diagram-skill"," を例に説明します：",[430,10130,10131],{},[433,10132],{"alt":10133,"src":10134},"外部の参照ファイルやテンプレートを読み込んでスキルを実行するAIエージェントのシーケンス図","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002Fai-agent-skill-with-reference-files-sequence-diagram.webp",[885,10136,10062],{"id":10137},"ステップバイステップ-1",[529,10139,10140,10145,10151,10160,10166,10177,10186],{},[484,10141,10142,10144],{},[448,10143,10069],{}," — ユーザーが「デプロイプロセスのワークフローを描いて（draw the workflow of the deployment process）」と依頼します。",[484,10146,10147,10150],{},[448,10148,10149],{},"選択用プロンプト"," — ユーザーのリクエストと、すべてのスキルの説明が LLM に送信されます。",[484,10152,10153,10155,10156,10159],{},[448,10154,10081],{}," — LLM はリクエストと説明を比較し、一致するスキルを返します。ここでは「ワークフローを描く」が ",[491,10157,10158],{},"excalidraw-diagram"," の説明と一致するため、このスキルが選択されます。",[484,10161,10162,10165],{},[448,10163,10164],{},"確認"," — エージェントは提案されたスキルをユーザーに提示し、ユーザーが確認します。",[484,10167,10168,10170,10171,10173,10174,10176],{},[448,10169,10093],{}," — エージェントは、確認されたスキルの指示本文（",[491,10172,8157],{},"）と、関連する参照ファイル（",[491,10175,10158],{}," の場合はカラーパレット、JSON スキーマ、要素テンプレートなど）をすべて読み込みます。",[484,10178,10179,10107,10182,10185],{},[448,10180,10181],{},"実行用プロンプト",[448,10183,10184],{},"スキルの指示と参照ファイル","を足したプロンプトが LLM に送信されます。モデルは必要な詳細な手法や仕様を把握できます。",[484,10187,10188,10190,10191,10194],{},[448,10189,10116],{}," — LLM がアウトプット（",[491,10192,10193],{},".excalidraw"," の JSON ファイル）を生成し、エージェントがそれをユーザーに返します。",[472,10196,10198],{"id":10197},"aiエージェントのスキル-vs-ツール-mcp","AIエージェントのスキル vs ツール ＆ MCP",[430,10200,10201],{},"スキルは、プロンプト、ツール（Tools）、MCP（Model Context Protocol）を置き換えるものではありません。ツールや MCP インテグレーションは、データベースへの問い合わせや API の呼び出しなど、外部システムへアクセスする「エージェントの腕」を伸ばす役割を持ちます。これに対し、スキルは特定のタスクを完遂するための「エージェントのノウハウ（専門知識）」を深める役割を持ちます。",[430,10203,10204,10205,10208],{},"例えば、",[441,10206,10207],{"href":395},"ChatGPTとClaudeでNetSuite MCPをセットアップする方法"," のような MCP を使えば、エージェントは NetSuite 内のリアルタイムな財務・業務データにアクセスしてユーザーの質問に答えられるようになります。そしてさらに「NetSuite業務レポートスキル」を組み合わせることで、エージェントはそのデータをどのように編集し、どのようなレポートとしてユーザーに提示すべきかという具体的な手順を実行できるようになります。",[430,10210,10211],{},"スキルの活用が特に効果的なシナリオ：",[481,10213,10214,10217,10220],{},[484,10215,10216],{},"複数ステップにわたる複雑なワークフロー",[484,10218,10219],{},"PDF からのデータ抽出など、ドキュメントの高度な処理",[484,10221,10222],{},"組織のコード生成標準に沿った実装",[472,10224,10226],{"id":10225},"aiエージェントのスキルの作成方法","AIエージェントのスキルの作成方法",[529,10228,10229,10239,10253,10262],{},[484,10230,10231,10234,10235,10238],{},[448,10232,10233],{},"フォルダを作成","し、スキルの名前を付けます（例：",[491,10236,10237],{},"netsuite-operation-report\u002F","）。",[484,10240,10241,10246,10247,10249,10250,10252],{},[448,10242,10243,10245],{},[491,10244,8157],{}," を作成","し、",[491,10248,9985],{},"（名前）、明確な ",[491,10251,9995],{},"（説明）、および簡潔な指示本文（200語以内）を記述します。",[484,10254,10255,10258,10259,10261],{},[448,10256,10257],{},"リソースを追加","します。タスクに必要な参照ドキュメント、テンプレート、スクリプトなどをフォルダ内に配置します。",[491,10260,8157],{}," 自体は短く保ち、詳細は各ファイルにリンクさせます。",[484,10263,10264,10266,10267,10270],{},[448,10265,9863],{},"してエージェントが発見できるようにします。複数のエージェント間でスキルを効率的に管理する方法については、",[441,10268,10269],{"href":359},"npx skillsによるAIエージェント用スキルの集中管理"," を参照してください。",[430,10272,10273],{},"質の高いスキルを作成するためのコツ：",[481,10275,10276,10279,10284,10287],{},[484,10277,10278],{},"説明文（description）は、人間向けではなく、システムが判別する「トリガー」として機能するように書きます。",[484,10280,10281,10283],{},[491,10282,8157],{}," は 200語以内で軽量に保ちます。本文には一般的な手順のみを書き、エッジケースは参照ドキュメントに委ねます。",[484,10285,10286],{},"確定的な処理にはスクリプト（コード）を使います。LLM に複雑な算術計算をさせないようにします。",[484,10288,10289],{},"バージョン管理を行い、Git にコミットします。",[472,10291,6149],{"id":6149},[430,10293,10294,10295,10298],{},"接続先（接続可能な外部システム）を定義する「ツール」や「MCP」とは異なり、エージェントの「スキル」は ",[448,10296,10297],{},"どのように仕事を遂行するか（実務の手順）"," をパッケージ化したものです。これらは競合するものではなく、お互いを補完し合う重要な関係にあります。",[430,10300,10301],{},"「段階的開示（Progressive Disclosure）」の仕組みを活かすことで、必要なときだけ詳細な手順や参照ドキュメント、実行スクリプトをロードできるため、エージェントのコンテキストウィンドウをクリーンで無駄のない状態に維持することができます。",[1650,10303,10304],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1067,"depth":1074,"links":10306},[10307,10308,10312,10313,10314],{"id":9948,"depth":1067,"text":9949},{"id":10039,"depth":1067,"text":10040,"children":10309},[10310,10311],{"id":10061,"depth":1074,"text":10062},{"id":10137,"depth":1074,"text":10062},{"id":10197,"depth":1067,"text":10198},{"id":10225,"depth":1067,"text":10226},{"id":6149,"depth":1067,"text":6149},[1670],"2026-06-26","AIエージェントのスキルとは何か、また状況に応じて詳細なシステム手順を効率的にロードする「段階的開示（Progressive Disclosure）」の仕組みを詳しく解説。開発者向けに再利用可能で強力なカスタムスキルを一から自作し、実開発に適用するための実践的な手順と手法を余すところなく紹介します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FAI%20Agent%20Skills%20What%20They%20Are%20%26%20How%20to%20Create%20Them\u002FJA-AI-Agent-Skills-What-They-Are-%26-How-to-Create-Them.webp","AIエージェントのスキル作成・開発ガイド：再利用可能で効率的なワークフローを構築する手順とベストプラクティス",{"schemaOrg":10321,"robots":1704,"sitemap":10323},[10322],{"@type":1683,"headline":8164,"description":10317},{"lastmod":10316},{"title":10319,"description":10317,"ogTitle":8164,"ogDescription":10317,"twitterTitle":8164,"twitterDescription":10317},"ja\u002Farticle\u002Fai-agent-skills-what-they-are-how-to-create-them",[1712,8411,10327,10328],"再利用可能なワークフロー","AIチュートリアル","sMzHllYBdhg70umNdDoR0_xCKy6Ict_7j3aoGx2f6uo",{"id":10331,"title":1740,"author":425,"body":10332,"category":10912,"date":10913,"description":10914,"extension":1675,"image":10915,"imageAlt":10916,"isPublished":1070,"meta":10917,"minRead":1074,"navigation":1070,"path":191,"seo":10931,"stem":10933,"tags":10934,"updatedAt":1713,"__hash__":10937},"article\u002Fja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server.md",{"type":427,"value":10333,"toc":10901},[10334,10338,10341,10344,10348,10352,10355,10368,10374,10377,10402,10409,10436,10443,10448,10462,10474,10480,10485,10501,10505,10508,10527,10533,10536,10547,10557,10568,10599,10603,10614,10624,10631,10642,10649,10656,10662,10683,10699,10703,10709,10721,10726,10752,10756,10759,10773,10783,10846,10849,10893,10895,10898],[472,10335,10337],{"id":10336},"なぜリモートvpsでhermes-agentをホストするのか","なぜリモートVPSでHermes Agentをホストするのか？",[430,10339,10340],{},"Hermes Agentはバックグラウンド処理の実行、タスクスケジューリング、そしてWebhook呼び出しへの応答が可能なため、24時間365日常時スタンバイ状態にあるマシンが必要です。ローカルマシンでは、停電やインターネット接続の切断、ハードウェアリソースの枯渇といった問題が発生するリスクがあります。リモートサーバー（VPS）であれば、99%以上の稼働率（Uptime）が保証され、必要に応じていつでも計算リソースを簡単にスケールアップできます。",[430,10342,10343],{},"Hetzner、Hostinger、Contaboなど、リーズナブルな価格で利用できる仮想専用サーバー（VPS）プロバイダーは数多く存在します。筆者は以前からContaboを愛用していますが、これまでのところ非常に安定して稼働しています。",[472,10345,10347],{"id":10346},"linux-vps上でのhermes-agentの設定手順","Linux VPS上でのHermes Agentの設定手順",[885,10349,10351],{"id":10350},"ステップ1-vpsへの接続","ステップ1: VPSへの接続",[430,10353,10354],{},"ターミナルを開き、SSHコマンドでリモートマシンにログインします:",[930,10356,10358],{"className":1038,"code":10357,"language":1040,"meta":425,"style":425},"ssh root@your_server_ip\n",[491,10359,10360],{"__ignoreMap":425},[938,10361,10362,10365],{"class":940,"line":941},[938,10363,10364],{"class":1047},"ssh",[938,10366,10367],{"class":1051}," root@your_server_ip\n",[430,10369,10370],{},[433,10371],{"alt":10372,"src":10373},"ターミナルでのLinux VPSサーバーへのSSH接続画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fvps-terminal-ssh-connection.webp",[430,10375,10376],{},"サーバーのパッケージを最新の状態に更新します:",[930,10378,10380],{"className":1038,"code":10379,"language":1040,"meta":425,"style":425},"sudo apt update && sudo apt upgrade -y\n",[491,10381,10382],{"__ignoreMap":425},[938,10383,10384,10386,10388,10391,10393,10395,10397,10400],{"class":940,"line":941},[938,10385,1901],{"class":1047},[938,10387,4469],{"class":1051},[938,10389,10390],{"class":1051}," update",[938,10392,5460],{"class":952},[938,10394,4390],{"class":1047},[938,10396,4469],{"class":1051},[938,10398,10399],{"class":1051}," upgrade",[938,10401,4502],{"class":1051},[430,10403,10404,10405,10408],{},"新しいユーザー（",[491,10406,10407],{},"hermes","またはお好みのユーザー名）を追加します:",[930,10410,10412],{"className":1038,"code":10411,"language":1040,"meta":425,"style":425},"sudo adduser hermes \nsudo passwd hermes\n",[491,10413,10414,10426],{"__ignoreMap":425},[938,10415,10416,10418,10421,10424],{"class":940,"line":941},[938,10417,1901],{"class":1047},[938,10419,10420],{"class":1051}," adduser",[938,10422,10423],{"class":1051}," hermes",[938,10425,2033],{"class":948},[938,10427,10428,10430,10433],{"class":940,"line":1067},[938,10429,1901],{"class":1047},[938,10431,10432],{"class":1051}," passwd",[938,10434,10435],{"class":1051}," hermes\n",[430,10437,10438,10439,10442],{},"セキュリティ向上のため、",[491,10440,10441],{},"root","ユーザーによるパスワードログインを無効化します:",[529,10444,10445],{},[484,10446,10447],{},"SSHの設定ファイルを開きます:",[930,10449,10451],{"className":1038,"code":10450,"language":1040,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fssh\u002Fsshd_config\n",[491,10452,10453],{"__ignoreMap":425},[938,10454,10455,10457,10459],{"class":940,"line":941},[938,10456,1901],{"class":1047},[938,10458,2318],{"class":1051},[938,10460,10461],{"class":1051}," \u002Fetc\u002Fssh\u002Fsshd_config\n",[529,10463,10464],{"start":1067},[484,10465,10466,10469,10470,10473],{},[491,10467,10468],{},"PermitRootLogin","という行を探し、値を",[491,10471,10472],{},"no","に変更します:",[930,10475,10478],{"className":10476,"code":10477,"language":4636,"meta":425},[4634],"PermitRootLogin no\n",[491,10479,10477],{"__ignoreMap":425},[529,10481,10482],{"start":1074},[484,10483,10484],{},"ファイルを保存し、SSHサービスを再起動します:",[930,10486,10488],{"className":1038,"code":10487,"language":1040,"meta":425,"style":425},"sudo systemctl restart ssh\n",[491,10489,10490],{"__ignoreMap":425},[938,10491,10492,10494,10496,10498],{"class":940,"line":941},[938,10493,1901],{"class":1047},[938,10495,1904],{"class":1051},[938,10497,1907],{"class":1051},[938,10499,10500],{"class":1051}," ssh\n",[885,10502,10504],{"id":10503},"ステップ2-hermes-agentのインストール","ステップ2: Hermes Agentのインストール",[430,10506,10507],{},"以下のコマンドを実行します:",[930,10509,10511],{"className":1038,"code":10510,"language":1040,"meta":425,"style":425},"curl -fsSL https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh | bash\n",[491,10512,10513],{"__ignoreMap":425},[938,10514,10515,10517,10519,10522,10524],{"class":940,"line":941},[938,10516,2997],{"class":1047},[938,10518,4381],{"class":1051},[938,10520,10521],{"class":1051}," https:\u002F\u002Fhermes-agent.nousresearch.com\u002Finstall.sh",[938,10523,4387],{"class":952},[938,10525,10526],{"class":1047}," bash\n",[430,10528,10529],{},[433,10530],{"alt":10531,"src":10532},"ターミナルでのHermes Agentインストールスクリプトの実行","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-installation-terminal.webp",[430,10534,10535],{},"インストール完了後、以下のコマンドを入力して正しくインストールされたか確認します:",[930,10537,10539],{"className":1038,"code":10538,"language":1040,"meta":425,"style":425},"hermes --version\n",[491,10540,10541],{"__ignoreMap":425},[938,10542,10543,10545],{"class":940,"line":941},[938,10544,10407],{"class":1047},[938,10546,3610],{"class":1051},[430,10548,10549,10552,10553],{},[491,10550,10551],{},"hermes setup","を実行して、Hermes Agentの基本設定を行います:\n",[433,10554],{"alt":10555,"src":10556},"セットアップを開始するためのターミナルでのhermes setupコマンド実行画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-agent-setup-wizard.webp",[430,10558,10559,10560,10563,10564],{},"使用するLLMプロバイダーを選択します。まずは",[491,10561,10562],{},"DeepSeek","から開始し、後から他のモデルを追加できます。\n",[433,10565],{"alt":10566,"src":10567},"HermesセットアップでのLLMプロバイダー（DeepSeek）の選択","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-llm-provider-selection.webp",[430,10569,10570,10572,10573,10577,10581,10582,10585,10586,10590,10591,10594,10595],{},[491,10571,10562],{},"のAPIキーを入力します:\n",[433,10574],{"alt":10575,"src":10576},"ターミナルでのDeepSeek APIキーの入力画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-enter-api-key.webp",[433,10578],{"alt":10579,"src":10580},"LLMプロバイダーのAPIキーの正常な確認メッセージ画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-api-key-success.webp","\nHermes Agentの実行環境として",[491,10583,10584],{},"local machine","を選択します:\n",[433,10587],{"alt":10588,"src":10589},"Hermes Agent実行環境としてのlocal machineの選択","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-local-machine.webp","\n連携チャンネル一覧から",[491,10592,10593],{},"Telegram","を選択します。その他のチャンネルは後から設定可能です。\n",[433,10596],{"alt":10597,"src":10598},"Hermesセットアップでの通信チャンネル（Telegram）の選択","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-select-telegram-channel.webp",[885,10600,10602],{"id":10601},"ステップ3-telegramとの連携統合","ステップ3: Telegramとの連携・統合",[430,10604,10605,10606,10609,10610],{},"Telegramボットを使用するため、",[491,10607,10608],{},"[2]","を選択します。\n",[433,10611],{"alt":10612,"src":10613},"Telegramボット連携を設定するオプションの選択画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-bot-integration-option.webp",[430,10615,10616,10617,10619,10620],{},"スマートフォンやPCで",[491,10618,10593],{},"を開き、「BotFather」を検索します。\n",[433,10621],{"alt":10622,"src":10623},"Telegramアプリ内でのBotFatherの検索画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-botfather.webp",[430,10625,10626,10627],{},"「Open」をクリックしてBotFatherとのチャットを開きます。\n",[433,10628],{"alt":10629,"src":10630},"TelegramでのBotFatherとのチャット画面の展開","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-open-botfather-chat.webp",[430,10632,10633,10634,10637,10638],{},"「Create a New Bot」（または",[491,10635,10636],{},"\u002Fnewbot","コマンド）をクリックします。\n",[433,10639],{"alt":10640,"src":10641},"新規Telegramボット作成のためのBotFatherへの\u002Fnewbotコマンド送信画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-create-new-bot.webp",[430,10643,10644,10645],{},"指示に従ってボットの名前とユーザー名を入力し、ボットを作成します。\n",[433,10646],{"alt":10647,"src":10648},"作成した新規Telegramボットの名前とユーザー名の設定画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-bot-details-configured.webp",[430,10650,10651,10652],{},"生成されたトークンをコピー（「Copy」をクリック）し、ターミナルに貼り付けます。\n",[433,10653],{"alt":10654,"src":10655},"新しく作成されたTelegramボットのHTTP APIトークンのコピー画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fbotfather-copy-http-api-token.webp",[430,10657,10658,10659,10661],{},"ご自身の",[491,10660,10593],{},"ユーザーアカウントIDを調べ、「Allowed user list」（アクセス許可リスト）に追加します:",[481,10663,10664,10673,10680],{},[484,10665,10666,10668,10669],{},[491,10667,10593],{},"で「@raw_data_bot」を検索します。\n",[433,10670],{"alt":10671,"src":10672},"ユーザーIDを取得するためのTelegramでのraw data botの検索画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-search-raw-data-bot.webp",[484,10674,10675,10676],{},"「RawDataBot」を開き、「Start（開始）」ボタンをクリックします。チャットに返信されたデータ内の「P.S. Your ID:」の後にユーザーIDが表示されます。\n",[433,10677],{"alt":10678,"src":10679},"ユーザーアカウントIDを表示するためのRawDataBotの開始画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-raw-data-bot-user-id.webp",[484,10681,10682],{},"ユーザーIDをコピーしてターミナルに入力（貼り付け）します。",[430,10684,10685,10686,10690,10691,10695],{},"今回はクラウド上で運用するため、サーバー起動時に自動でサービスが開始されるようにします。\n",[433,10687],{"alt":10688,"src":10689},"Hermes systemdサービスの自動起動（autostart）オプションの設定画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-autostart-service-option.webp","\n他の設定項目はすべてデフォルト（推奨値）のまま進めます:\n",[433,10692],{"alt":10693,"src":10694},"ターミナルでのセットアップ構成のデフォルト値の維持","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-1.webp",[433,10696],{"alt":10697,"src":10698},"Hermes構成でのデフォルトセットアップオプションの適用完了","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Fhermes-setup-leave-defaults-2.webp",[472,10700,10702],{"id":10701},"telegramボットを使ったhermes-agentの動作テスト","Telegramボットを使ったHermes Agentの動作テスト",[430,10704,5606,10705,10708],{},[491,10706,10707],{},"hermes gateway","を起動します:",[930,10710,10712],{"className":1038,"code":10711,"language":1040,"meta":425,"style":425},"hermes gateway\n",[491,10713,10714],{"__ignoreMap":425},[938,10715,10716,10718],{"class":940,"line":941},[938,10717,10407],{"class":1047},[938,10719,10720],{"class":1051}," gateway\n",[430,10722,10723,10725],{},[491,10724,10593],{},"を開き、作成したボット「@tech_cloud_hermes_bot」を検索してチャットに追加します。",[481,10727,10728,10738,10745],{},[484,10729,10730,10731,10733,10734],{},"チャットに「\u002Fnew」と入力して送信し、新しい",[491,10732,1725],{},"セッションを開始します。\n",[433,10735],{"alt":10736,"src":10737},"新規Hermes Agentセッションを開始するためのTelegramでの\u002Fnewコマンド入力","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-new-session.webp",[484,10739,10740,10741],{},"「\u002Fcommands」と入力すると、利用可能なすべてのコマンドが一覧表示されます。\n",[433,10742],{"alt":10743,"src":10744},"利用可能なHermesコマンドを表示するためのTelegramでの\u002Fcommands入力","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-commands-list.webp",[484,10746,10747,10748],{},"「\u002Fmodel」と入力すると、利用可能なLLMモデルの一覧が表示されます。\n",[433,10749],{"alt":10750,"src":10751},"有効なLLMモデル一覧を表示するためのTelegramでの\u002Fmodel入力画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002Ftelegram-chat-hermes-model-selection.webp",[472,10753,10755],{"id":10754},"hermes-gatewayをバックグラウンドサービスとして常時実行する","Hermes Gatewayをバックグラウンドサービスとして常時実行する",[430,10757,10758],{},"systemdのサービスファイルを作成します:",[930,10760,10762],{"className":2307,"code":10761,"language":2309,"meta":425,"style":425},"sudo nano \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[491,10763,10764],{"__ignoreMap":425},[938,10765,10766,10768,10770],{"class":940,"line":941},[938,10767,1901],{"class":1047},[938,10769,2318],{"class":1051},[938,10771,10772],{"class":1051}," \u002Fetc\u002Fsystemd\u002Fsystem\u002Fhermes-gateway.service\n",[430,10774,10775,10776,10779,10780,10782],{},"以下の内容を貼り付けます。なお、",[491,10777,10778],{},"\u002Fhome\u002Fhermes","の部分の",[491,10781,10407],{},"はご自身で設定したユーザー名に書き換えてください:",[930,10784,10786],{"className":2333,"code":10785,"language":2335,"meta":425,"style":425},"[Unit]\nDescription=Hermes Gateway\nAfter=network.target\n\n[Service]\nUser=hermes\nWorkingDirectory=\u002Fhome\u002Fhermes\nExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\nRestart=always\nRestartSec=10\nEnvironment=PATH=\u002Fhome\u002Fhermes\u002F.local\u002Fbin:\u002Fusr\u002Flocal\u002Fbin:\u002Fusr\u002Fbin:\u002Fbin\n\n[Install]\nWantedBy=multi-user.target\n",[491,10787,10788,10792,10797,10801,10805,10809,10813,10817,10822,10826,10830,10834,10838,10842],{"__ignoreMap":425},[938,10789,10790],{"class":940,"line":941},[938,10791,2342],{},[938,10793,10794],{"class":940,"line":1067},[938,10795,10796],{},"Description=Hermes Gateway\n",[938,10798,10799],{"class":940,"line":1074},[938,10800,2352],{},[938,10802,10803],{"class":940,"line":1081},[938,10804,1071],{"emptyLinePlaceholder":1070},[938,10806,10807],{"class":940,"line":1933},[938,10808,2361],{},[938,10810,10811],{"class":940,"line":1938},[938,10812,2366],{},[938,10814,10815],{"class":940,"line":1944},[938,10816,2371],{},[938,10818,10819],{"class":940,"line":2277},[938,10820,10821],{},"ExecStart=\u002Fhome\u002Fhermes\u002F.local\u002Fbin\u002Fhermes gateway\n",[938,10823,10824],{"class":940,"line":2288},[938,10825,2381],{},[938,10827,10828],{"class":940,"line":2384},[938,10829,2387],{},[938,10831,10832],{"class":940,"line":2390},[938,10833,2393],{},[938,10835,10836],{"class":940,"line":2396},[938,10837,1071],{"emptyLinePlaceholder":1070},[938,10839,10840],{"class":940,"line":2401},[938,10841,2404],{},[938,10843,10844],{"class":940,"line":2407},[938,10845,2410],{},[430,10847,10848],{},"作成したサービスを有効化し、起動します:",[930,10850,10852],{"className":2307,"code":10851,"language":2309,"meta":425,"style":425},"sudo systemctl daemon-reload\nsudo systemctl enable hermes-gateway\nsudo systemctl start hermes-gateway\nsudo systemctl status hermes-gateway\n",[491,10853,10854,10862,10873,10883],{"__ignoreMap":425},[938,10855,10856,10858,10860],{"class":940,"line":941},[938,10857,1901],{"class":1047},[938,10859,1904],{"class":1051},[938,10861,2429],{"class":1051},[938,10863,10864,10866,10868,10870],{"class":940,"line":1067},[938,10865,1901],{"class":1047},[938,10867,1904],{"class":1051},[938,10869,2030],{"class":1051},[938,10871,10872],{"class":1051}," hermes-gateway\n",[938,10874,10875,10877,10879,10881],{"class":940,"line":1074},[938,10876,1901],{"class":1047},[938,10878,1904],{"class":1051},[938,10880,2449],{"class":1051},[938,10882,10872],{"class":1051},[938,10884,10885,10887,10889,10891],{"class":940,"line":1081},[938,10886,1901],{"class":1047},[938,10888,1904],{"class":1051},[938,10890,1928],{"class":1051},[938,10892,10872],{"class":1051},[472,10894,6149],{"id":6149},[430,10896,10897],{},"本記事では、Hermes Agentの基本的なセットアップ方法と、Telegramを利用した双方向の通信設定について解説しました。リモートサーバー上でHermes Agentを常時稼働させることで、24時間365日いつでも応対してくれる本物のデジタルアシスタントを手にすることができます。",[1650,10899,10900],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":425,"searchDepth":1067,"depth":1074,"links":10902},[10903,10904,10909,10910,10911],{"id":10336,"depth":1067,"text":10337},{"id":10346,"depth":1067,"text":10347,"children":10905},[10906,10907,10908],{"id":10350,"depth":1074,"text":10351},{"id":10503,"depth":1074,"text":10504},{"id":10601,"depth":1074,"text":10602},{"id":10701,"depth":1067,"text":10702},{"id":10754,"depth":1067,"text":10755},{"id":6149,"depth":1067,"text":6149},[1670],"2026-06-19","本ガイドでは、常時安定した稼働を維持するために、信頼性の高いリモートLinux VPSサーバー環境上にHermes Agentをインストールして、バックグラウンドサービスとして実行・デプロイする詳細な手順を解説します。また、カスタムTelegramボットと連携させて双方向の指示・操作を行う統合手順も説明。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FHow%20to%20Setup%20Hermes%20on%20Remote%20Server\u002FJA-How%20to%20Setup%20Hermes%20on%20Remote%20Server.webp","Linux VPS上にHermes AgentをデプロイしてカスタムTelegramボットと連携・常時稼働させる詳細手順。",{"schemaOrg":10918,"robots":1704,"sitemap":10930},[10919],{"@type":1683,"name":1740,"description":10914,"image":10915,"step":10920},[10921,10924,10927],{"@type":1686,"name":10351,"text":10922,"image":10373,"url":10923},"ターミナルを開き、SSHコマンドでリモートマシンにログインします: サーバーのパッケージを最新の状態に更新します: 新しいユーザー（`hermes`またはお好みのユーザー名）を追加します: セキュリティ向上のため、`root`ユーザーによるパスワードログインを無効化します: 1. SSHの設定...","#1-vps",{"@type":1686,"name":10504,"text":10925,"image":10532,"url":10926},"以下のコマンドを実行します: インストール完了後、以下のコマンドを入力して正しくインストールされたか確認します: `hermes setup`を実行して、Hermes Agentの基本設定を行います: 使用するLLMプロバイダーを選択します。まずは`DeepSeek`から開始し、後から他のモデ...","#2-hermes-agent",{"@type":1686,"name":10602,"text":10928,"image":10613,"url":10929},"Telegramボットを使用するため、`[2]`を選択します。 スマートフォンやPCで`Telegram`を開き、「BotFather」を検索します。 「Open」をクリックしてBotFatherとのチャットを開きます。 「Create a New Bot」（または`\u002Fnewbot`コマンド）...","#3-telegram",{"lastmod":10913},{"title":10932,"description":10914,"ogTitle":1740,"ogDescription":10914,"twitterTitle":1740,"twitterDescription":10914},"Hermes Agent VPS Setup: Telegram Bot Integration Guide","ja\u002Farticle\u002Fhow-to-setup-hermes-on-remote-server",[1725,10935,10936,4216,8594],"VPS Setup","Telegram Bot","T5AkYhVsmNEB6fjwc0fyF4uOXnsjfkr6qwWDyXzLCnM",{"id":10939,"title":10940,"author":1713,"body":10941,"category":11374,"date":11375,"description":11376,"extension":1675,"image":11377,"imageAlt":11378,"isPublished":1070,"meta":11379,"minRead":9645,"navigation":1070,"path":199,"seo":11383,"stem":11385,"tags":11386,"updatedAt":1713,"__hash__":11389},"article\u002Fja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude.md","NetSuite AI Connector導入運用完全ガイド：MCP設定手順と実用的なユースケースの解説",{"type":427,"value":10942,"toc":11360},[10943,10946,10960,10964,10974,10984,10988,11122,11126,11181,11185,11237,11241,11245,11251,11256,11260,11266,11278,11282,11292,11308,11312,11318,11323,11327,11330,11333,11337],[430,10944,10945],{},"Oracle NetSuiteは、中堅・中小企業向けのクラウド型統合基幹業務パッケージ（ERP）プラットフォームとして長年にわたり広く利用されてきました。しかしその一方で、複雑なWeb UI、クリック数の多い画面遷移、そして柔軟性に欠ける標準レポート機能など、使いこなすまでの学習コストの高さでも知られています。",[430,10947,10948,10949,10952,10953,10959],{},"そうした中、新たにリリースされた",[448,10950,10951],{},"NetSuite AI Connector Service","により、ユーザーは",[448,10954,10955,10956,10958],{},"Model Context Protocol（MCP）",[448,10957,1730],{},"AI（人工知能）アシスタント","を活用できるようになりました。これにより、財務や業務に関するデータを自然な話し言葉（自然言語）で直接問いかけ、リアルタイムに回答を得ることが可能になります。",[472,10961,10963],{"id":10962},"netsuite-mcp-aiコネクタの仕組み","NetSuite MCP AIコネクタの仕組み",[430,10965,10966,10969,10970,10973],{},[448,10967,10968],{},"NetSuiteのMCP","は、SuiteQLクエリの実行、保存検索（Saved Search）やレポートの読み取り、あるいは新規顧客レコードの作成といったレコード操作など、一連のツールを",[448,10971,10972],{},"AI","に提供します。すべてのツールは、NetSuite標準の役割（ロール）に基づく権限コントロール（RBAC）に厳格に準拠して実行されます。",[430,10975,10976,10977,10979,10980,10983],{},"ユーザーが自然言語で質問すると、",[448,10978,10972],{},"は**Model Context Protocol（MCP）**を介して、その要求をNetSuiteが解釈できる構造化された処理へと変換します。",[448,10981,10982],{},"NetSuite","はユーザーのアクセス権限に基づいて処理を実行し、その結果がAIに返されます。その後、AIがデータを分析・整形してユーザーに提示します。",[472,10985,10987],{"id":10986},"netsuite-ai-connector-設定ガイド","NetSuite AI Connector 設定ガイド",[529,10989,10990,11044,11059,11068,11075,11082,11103],{},[484,10991,10992,1842,10995,10998,10999],{},[448,10993,10994],{},"サーバーSuiteScript",[448,10996,10997],{},"RESTWebサービス"," の有効化\n",[529,11000,11001,11011,11038],{},[484,11002,1120,11003,11006,11007],{},[905,11004,11005],{},"セットアップ > 会社 > 機能の有効化","」に移動します。\n",[433,11008],{"alt":11009,"src":11010},"Oracle NetSuiteの「機能の有効化」設定画面（「セットアップ > 会社」配下）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-setup-company-enable-features.webp",[484,11012,1120,11013,11016,11017],{},[448,11014,11015],{},"SuiteCloud","」サブタブを開きます：\n",[481,11018,11019,11029],{},[484,11020,11021,11022,11024,11025],{},"「SuiteScript」セクションの「",[448,11023,10994],{},"」にチェックを入れます。\n",[433,11026],{"alt":11027,"src":11028},"NetSuiteのSuiteCloudタブで「サーバーSuiteScript」のチェックボックスをオンにして有効化する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-server-suitescript.webp",[484,11030,11031,11032,11024,11034],{},"「SuiteTalk（Webサービス）」セクションの「",[448,11033,10997],{},[433,11035],{"alt":11036,"src":11037},"NetSuiteのSuiteCloudタブで「REST Webサービス」のチェックボックスをオンにして有効化する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-enable-features-rest-web-services.webp",[484,11039,1120,11040,11043],{},[448,11041,11042],{},"保存","」をクリックします。",[484,11045,11046,11047,11050,11051,11054,11055],{},"最初に",[448,11048,11049],{},"NetSuite MCP Standard Tools","をインストールします。「",[905,11052,11053],{},"カスタマイズ > SuiteCloud開発 > SuiteAppマーケットプレイス","」をクリックします。\n",[433,11056],{"alt":11057,"src":11058},"NetSuiteの「カスタマイズ > SuiteCloud開発」からSuiteAppマーケットプレイスへ遷移する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-navigation.webp",[484,11060,1120,11061,11063,11064],{},[448,11062,11049],{},"」を検索します。\n",[433,11065],{"alt":11066,"src":11067},"SuiteAppマーケットプレイスで「NetSuite MCP Standard Tools」を検索する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-marketplace-search-mcp-tools.webp",[484,11069,11070,11071],{},"インストールが完了すると、右側に「インストール済（Installed）」ステータスが表示されます。\n",[433,11072],{"alt":11073,"src":11074},"SuiteAppマーケットプレイスで「NetSuite MCP Standard Tools」のステータスが「インストール済み」と表示されている画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-status-mcp-tools.webp",[484,11076,11077,11078],{},"同様の手順で「NetSuite AI Connector Service Companion」もインストールします。\n",[433,11079],{"alt":11080,"src":11081},"「NetSuite AI Connector Service Companion」が正常にインストールされたことを示す画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-suiteapp-installed-ai-connector-companion.webp",[484,11083,11084,11085],{},"統合レコード（Integration Record）の作成\n",[529,11086,11087,11096],{},[484,11088,1120,11089,11006,11092],{},[905,11090,11091],{},"セットアップ > 統合 > 統合の管理",[433,11093],{"alt":11094,"src":11095},"NetSuiteのセットアップメニューで「統合 > 統合を管理」へ遷移する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-integration-manage-integrations-navigation.webp",[484,11097,11098,11099],{},"ChatGPT用の統合レコードを作成します。実際のトークンID（token_id）は後ほど登録します。\n",[433,11100],{"alt":11101,"src":11102},"ChatGPTとの接続用としてNetSuite側で新規にインテグレーションレコードを作成する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-create-integration-record-chatgpt.webp",[484,11104,11105,11106,11110,11114,11118],{},"最小限のアクセス権限を定義したMCP用のカスタムロールを作成し、ユーザーに割り当てます。例：\n",[433,11107],{"alt":11108,"src":11109},"NetSuite MCP統合に必要なカスタムロールの権限設定画面（その1）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-1.webp",[433,11111],{"alt":11112,"src":11113},"NetSuite MCP統合に必要なカスタムロールの権限設定画面（その2）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-2.webp",[433,11115],{"alt":11116,"src":11117},"NetSuite MCP統合に必要なカスタムロールの権限設定画面（その3）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-3.webp",[433,11119],{"alt":11120,"src":11121},"NetSuite MCP統合に必要なカスタムロールの権限設定画面（その4）","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-custom-role-mcp-permissions-4.webp",[472,11123,11125],{"id":11124},"netsuite-mcpをchatgptに統合設定する方法","NetSuite MCPをChatGPTに統合・設定する方法",[529,11127,11128,11135,11142,11149,11160,11167,11174],{},[484,11129,11130,11131],{},"ChatGPTの「Settings（設定）」をクリックします。\n",[433,11132],{"alt":11133,"src":11134},"ChatGPTのユーザーインターフェースで「設定（Settings）」画面を開いた状態","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-settings-navigation.webp",[484,11136,11137,11138],{},"「Apps（アプリ）」>「Advanced settings（高度な設定）」の順にクリックします。\n",[433,11139],{"alt":11140,"src":11141},"ChatGPT設定内の「Apps」から「詳細設定（Advanced settings）」を選択する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-apps-advanced-settings.webp",[484,11143,11144,11145],{},"「Developer mode（開発者モード）」を有効化し、「Create app（アプリ作成）」をクリックします。\n",[433,11146],{"alt":11147,"src":11148},"ChatGPTで「開発者モード（Developer mode）」を有効にして「アプリの作成」をクリックする画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-developer-mode-create-app.webp",[484,11150,11151,11152,11155,11156],{},"必要な項目を入力します。「Connection」には ",[491,11153,11154],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fall"," を入力します。\n",[433,11157],{"alt":11158,"src":11159},"ChatGPTアプリ作成画面でNetSuite MCP接続用のサーバーURLを入力する設定画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-create-app-netsuite-mcp-connection.webp",[484,11161,11162,11163],{},"「Create（作成）」をクリックします。接続が確立されると、以下のポップアップが表示されます。\n",[433,11164],{"alt":11165,"src":11166},"ChatGPT内でNetSuite MCPが正常に統合・連携されたことを示すポップアップ通知画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-mcp-integrated-popup.webp",[484,11168,11169,11170],{},"「Sign in with NetSuite MCP（NetSuite MCPでサインイン）」をクリックします。\n",[433,11171],{"alt":11172,"src":11173},"ChatGPTから「NetSuite MCP」ツールへのサインインを求める認証ダイアログ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-sign-in-with-netsuite-mcp.webp",[484,11175,11176,11177],{},"「Continue（続行）」ボタンをクリックし、権限の付与を承認します。\n",[433,11178],{"alt":11179,"src":11180},"ChatGPT認証画面でNetSuite MCP連携用のアカウントアクセス権限を承認する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-grant-permissions-netsuite-mcp.webp",[472,11182,11184],{"id":11183},"netsuite-mcpをclaude-aiに統合設定する方法","NetSuite MCPをClaude AIに統合・設定する方法",[529,11186,11187,11194,11201,11208,11223,11230],{},[484,11188,11189,11190],{},"Claudeの「Customize（カスタマイズ）」をクリックします。\n",[433,11191],{"alt":11192,"src":11193},"Claude AIインターフェースで「カスタマイズ（Customize）」をクリックする操作画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-customize-navigation.webp",[484,11195,11196,11197],{},"「Connect your apps（アプリを接続）」をクリックします。\n",[433,11198],{"alt":11199,"src":11200},"Claude AIのカスタマイズ設定で「アプリを接続（Connect your apps）」を選択する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-connect-your-apps.webp",[484,11202,11203,11204],{},"「NetSuite」を検索します。\n",[433,11205],{"alt":11206,"src":11207},"Claude AIの連携アプリ一覧から「NetSuite」を検索する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-search-netsuite-app.webp",[484,11209,11210,11211,11214,11215,11218,11219],{},"「NetSuite」を選択し、サーバーURLを入力します：",[491,11212,11213],{},"https:\u002F\u002F\u003Caccount_id>.suitetalk.api.netsuite.com\u002Fservices\u002Fmcp\u002Fv1\u002Fsuiteapp\u002Fcom.netsuite.mcpstandardtools","。（",[491,11216,11217],{},"\u003Caccount_id>"," はご自身のNetSuiteアカウントIDに置き換えてください）。\n",[433,11220],{"alt":11221,"src":11222},"Claude AI設定でNetSuite MCPサーバーの接続URLを入力するセットアップ画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-server-url-setup.webp",[484,11224,11225,11226],{},"「Continue（続行）」ボタンをクリックします。\n",[433,11227],{"alt":11228,"src":11229},"Claude AIでNetSuite MCP接続設定を進めるための認証確認画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-continue-authentication.webp",[484,11231,11232,11233],{},"再度「Continue（続行）」をクリックして、コネクタの認証を完了させます。\n",[433,11234],{"alt":11235,"src":11236},"Claude AIとNetSuite MCPコネクタの連携を完了するための最終認証画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-netsuite-mcp-authenticate-connector.webp",[472,11238,11240],{"id":11239},"netsuite-ai-実際の活用ケース","NetSuite AI 実際の活用ケース",[885,11242,11244],{"id":11243},"chatgptでのユースケースnetsuite内の30日を超える未払請求書滞留債権の一覧表示","ChatGPTでのユースケース：NetSuite内の30日を超える未払請求書（滞留債権）の一覧表示",[430,11246,11247],{},[433,11248],{"alt":11249,"src":11250},"ChatGPTがSuiteQLクエリを自動生成・実行して期限切れの請求書一覧を抽出・表示するユースケース","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-netsuite-overdue-invoices-query-result.webp",[481,11252,11253],{},[484,11254,11255],{},"ChatGPTが自動的にSuiteQLクエリを生成して実行しました。NetSuiteの標準UIで一からレポートを組むのに比べて大幅な時間短縮になり、非常に実用的です。",[885,11257,11259],{"id":11258},"chatgptとclaudeでのユースケース過去30日間の売上推移を折れ線グラフで描画する","ChatGPTとClaudeでのユースケース：過去30日間の売上推移を折れ線グラフで描画する",[430,11261,11262],{},[433,11263],{"alt":11264,"src":11265},"ChatGPTにNetSuiteの売上折れ線グラフ作成を依頼したものの出力に失敗したエラー画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-failed-render-netsuite-sales-line-graph.webp",[481,11267,11268,11271],{},[484,11269,11270],{},"今回の検証時、ChatGPTは折れ線グラフを直接レンダリングすることができませんでした。",[484,11272,11273,11274],{},"一方、Claudeで同じ指示を試したところ、綺麗にグラフ化されました。この動作の差は、各大規模言語モデル（LLM）のデータ処理や画像生成能力の違いによるものと考えられます。\n",[433,11275],{"alt":11276,"src":11277},"Claude AIがNetSuiteの売上データから美しい折れ線グラフを正常に描画・出力したユースケース","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-successfully-rendered-netsuite-sales-line-graph.webp",[885,11279,11281],{"id":11280},"claudeでのユースケース新規顧客レコードの作成","Claudeでのユースケース：新規顧客レコードの作成",[430,11283,11284,11288],{},[433,11285],{"alt":11286,"src":11287},"Claude AIに自然言語でNetSuiteの新規顧客レコード作成を指示した入力画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-prompt.webp",[433,11289],{"alt":11290,"src":11291},"Claude AIがNetSuite側で顧客レコードの作成に成功したことを示す応答画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-create-netsuite-customer-record-success.webp",[481,11293,11294,11301],{},[484,11295,11296,11297],{},"NetSuiteの管理画面にログインして確認すると、指定した通りの顧客レコードが正しく登録されていることが確認できます。\n",[433,11298],{"alt":11299,"src":11300},"作成された顧客レコードがNetSuite標準のWeb画面に正しく反映されていることを確認した画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fnetsuite-ui-verify-new-customer-record-created.webp",[484,11302,11303,11304],{},"その後、ChatGPT側からクエリを実行しても、作成されたレコードを正常に検出できます：\n",[433,11305],{"alt":11306,"src":11307},"ChatGPT側でも新規作成されたNetSuiteの顧客レコードが読み取り可能であることを確認した画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fchatgpt-verify-netsuite-customer-record-available.webp",[885,11309,11311],{"id":11310},"claudeでのユースケースsuiteqlクエリの直接実行","Claudeでのユースケース：SuiteQLクエリの直接実行",[430,11313,11314],{},[433,11315],{"alt":11316,"src":11317},"Claude AIがNetSuiteのSuiteQLクエリを直接実行しデータを表形式で返したユースケース","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002Fclaude-ai-run-suiteql-query-result.webp",[481,11319,11320],{},[484,11321,11322],{},"データベースに対してSuiteQLを直接投げ、素早く結果を得ることができます。",[472,11324,11326],{"id":11325},"まとめnetsuite-ai-connectorの評価と展望","まとめ：NetSuite AI Connectorの評価と展望",[430,11328,11329],{},"MCPを導入する最大のメリットは、複雑なSQLやレポーティング機能に詳しくないノンテクニカルなユーザー層にあります。自然な言葉で問いかけるだけで、必要なデータが必要なフォーマット（表やグラフなど）でAIから提示され、業務効率が劇的に改善します。",[430,11331,11332],{},"一方で、プロンプトインジェクション攻撃や、意図しないデータの「書き込み」操作を防ぐために、書き込み権限を与える対象レコードやトランザクションは最小限に絞る必要があります。AIがMCPを利用してデータを更新・作成する際、バックエンドではサーバーサイドのSuiteScriptとして実行されるため、ブラウザ側（クライアントサイド）のJavaScript制御や画面上の入力バリデーションはすべてバイパスされる点に十分留意してください。",[472,11334,11336],{"id":11335},"参考リンク英語","参考リンク（英語）:",[481,11338,11339,11346,11353],{},[484,11340,11341],{},[441,11342,11345],{"href":11343,"rel":11344},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_0902023450.html#subsect_90090238176",[445],"MCP Standard Tools SuiteAppのインストール手順（公式ドキュメント）",[484,11347,11348],{},[441,11349,11352],{"href":11350,"rel":11351},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Farticle_4160616848.html#subsect_0419123151",[445],"NetSuite AI Connector Service FAQ（公式ドキュメント）",[484,11354,11355],{},[441,11356,11359],{"href":11357,"rel":11358},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Fsection_0714082142.html#bridgehead_0804033331",[445],"NetSuite AI Connector Serviceへの接続手順（公式ドキュメント）",{"title":425,"searchDepth":1067,"depth":1074,"links":11361},[11362,11363,11364,11365,11366,11372,11373],{"id":10962,"depth":1067,"text":10963},{"id":10986,"depth":1067,"text":10987},{"id":11124,"depth":1067,"text":11125},{"id":11183,"depth":1067,"text":11184},{"id":11239,"depth":1067,"text":11240,"children":11367},[11368,11369,11370,11371],{"id":11243,"depth":1074,"text":11244},{"id":11258,"depth":1074,"text":11259},{"id":11280,"depth":1074,"text":11281},{"id":11310,"depth":1074,"text":11311},{"id":11325,"depth":1067,"text":11326},{"id":11335,"depth":1067,"text":11336},[1670],"2026-06-13","NetSuite AI Connector (MCP)をChatGPTやClaudeと連携して設定する方法をステップバイステップで解説します。自然言語のAIチャットを用いてERPの財務・業務データを直接クエリし、データの抽出や定型業務を安全かつ効率的に自動化する具体的な仕組みと実用的なユースケースを紹介。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20NetSuite%20MCP%20on%20ChatGPT%20%26%20Claude\u002FJA-Setup-NetSuite-MCP-on-ChatGPT-%26-Claude.webp","ChatGPTとClaudeのロゴがNetSuiteのクラウドデータベースに接続された、ダークブルーの企業背景を特徴とするNetSuite MCP AI連携のサムネイル画像",{"schemaOrg":11380,"robots":1704,"sitemap":11382},[11381],{"@type":1681,"headline":10940,"description":11376},{"lastmod":11375},{"title":11384,"description":11376,"ogTitle":10940,"ogDescription":11376,"twitterTitle":10940,"twitterDescription":11376},"NetSuite MCP AI連携：ChatGPTとClaudeの接続・統合方法","ja\u002Farticle\u002Fsetup-netsuite-mcp-on-chatgpt-claude",[10982,7977,11387,11388,10972],"ChatGPT","Claude","DIHCTN-HQPFUqQocI-5jH3xIO2bhkKhD1mJBmDYtdHg",{"id":11391,"title":11392,"author":1713,"body":11393,"category":11589,"date":11590,"description":11591,"extension":1675,"image":11592,"imageAlt":11593,"isPublished":1070,"meta":11594,"minRead":3364,"navigation":1070,"path":205,"seo":11598,"stem":11599,"tags":11600,"updatedAt":1713,"__hash__":11604},"article\u002Fja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis.md","最先端AI Claude Fable 5を徹底検証：企業財務分析における驚異的な実力と詳細な評価レビュー",{"type":427,"value":11394,"toc":11587},[11395,11406,11417,11420,11426,11443,11453,11459,11465,11471,11493,11503,11517,11525,11544,11547,11558,11567,11570,11584],[430,11396,11397,11398,11401,11402],{},"2026年6月9日、Anthropic社は、サイバーセキュリティ、蒸留（ディスティレーション）、化学、生物学などの特定領域において高度なセーフガードを備えた「Mythos（ミトス）」クラスのモデルである",[448,11399,11400],{},"Claude Fable 5","をリリースしました。\n",[433,11403],{"alt":11404,"src":11405},"AnthropicによるClaude Fable 5のリリース発表とモデル機能の紹介","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-launch-announcement.webp",[430,11407,11408,11409,11412,11413],{},"Anthropicが公開したデータによると、Fable 5はいくつかの主要ベンチマークでOpus 4.8やGPT-5.5を上回っています。特にナレッジワークを評価する",[448,11410,11411],{},"GDPval-AA","では、Opus 4.8、GPT 5.5、Gemini 3.1 Proを大幅にリードしています。\n",[433,11414],{"alt":11415,"src":11416},"GDPval-AA（ナレッジワーク）指標を含むClaude Fable 5のベンチマーク性能比較図","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-benchmarks-gdpval-aa.webp",[430,11418,11419],{},"Claudeの公式発表によると、「Fable 5は、複雑な分析タスクにおいて強力なパフォーマンスを発揮する」とされています。",[430,11421,11422],{},[433,11423],{"alt":11424,"src":11425},"複雑な分析タスクにおいて強力なパフォーマンスを示すClaude Fable 5の説明声明","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-analytical-performance-statement.webp",[430,11427,11428,11429,11432,11433,11436,11437,11442],{},"そこで私たちは、投資リサーチを目的として、「Space Exploration Technologies Corporation（SpaceX）」の企業比較分析を実行し、",[448,11430,11431],{},"Fable 5","の実力をテストすることにしました。今回使用した「",[448,11434,11435],{},"comps-analysis","」スキル（skill.md）は、",[441,11438,11441],{"href":11439,"rel":11440},"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Ffinancial-services\u002Fblob\u002Fmain\u002Fplugins\u002Fagent-plugins\u002Fmarket-researcher\u002Fskills\u002Fcomps-analysis\u002FSKILL.md",[445],"Anthropicの金融サービス向けGitHubリポジトリ","から取得したものです。",[430,11444,11445,11449],{},[433,11446],{"alt":11447,"src":11448},"Claudeのチャット画面におけるSpaceX財務比較分析スキルの開始シーン","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-initiation.webp",[433,11450],{"alt":11451,"src":11452},"Claude Fable 5が自律的にSpaceXの自動財務分析スキルを実行している進行画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-running-progress.webp",[430,11454,11455],{},[433,11456],{"alt":11457,"src":11458},"SpaceXの自動財務比較分析ワークフローが完了した最終出力画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fspacex-comps-analysis-skill-results-terminal.webp",[430,11460,11461,11462,11464],{},"タスクの完了までにかかった時間は約25分でした。Claudeは外部ウェブサイトへのアクセス許可を求めた以外、一切の質問をしてきませんでした。素晴らしいことに、",[448,11463,11431],{},"は比較対象となる同業他社（ピアグループ）を自律的に見つけ出す能力を示しました。",[430,11466,11467],{},[433,11468],{"alt":11469,"src":11470},"外部ウェブサイトへのリアルタイムアクセス許可を要求するClaude Fable 5のダイアログ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-external-site-access-permission.webp",[430,11472,11473,11477,11478,11480,11481,11486,11487,11492],{},[433,11474],{"alt":11475,"src":11476},"Claude Fable 5がWebから自動で検出・特定したSpaceXの競合比較企業グループ一覧","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-spacex-comps-excel-memo.webp","\n*",[448,11479,5206],{}," 本記事は研究および教育目的のみを目的としており、投資勧誘やアドバイスを行うものではありません。実際に生成されたオリジナルファイルは、こちらからダウンロード可能です：Excelシート「",[441,11482,11485],{"href":11483,"rel":11484},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Analysis_2026-06-10.xlsx",[445],"SpaceX_Comps_Analysis_2026-06-10.xlsx","」、分析メモ「",[441,11488,11491],{"href":11489,"rel":11490},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Comps_Memo_2026-06-10.pdf",[445],"SpaceX_Comps_Memo_2026-06-10.pdf","」。",[430,11494,11495,11496,11499,11500,11502],{},"一方、同じスキルを",[448,11497,11498],{},"Qwen deep research","でテストした際には、比較対象企業を手動で入力する必要がありました。また、算出された数値も",[448,11501,11431],{},"と比較して若干の差異が見られました。",[430,11504,11505,11509,11513],{},[433,11506],{"alt":11507,"src":11508},"Qwen deep researchのシステム画面でSpaceXの財務比較分析を呼び出している様子","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-initiation.webp",[433,11510],{"alt":11511,"src":11512},"Qwen deep researchのSpaceX分析で比較対象となる同業他社を手動で入力している手順","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-running.webp",[433,11514],{"alt":11515,"src":11516},"Qwenが自動生成したSpaceXの財務指標および成長ベンチマークレポートのプレビュー","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-spacex-comps-report-preview.webp",[430,11518,11519,11520,6666],{},"*Qwenが生成したレポートはこちらからダウンロードできます：",[441,11521,11524],{"href":11522,"rel":11523},"https:\u002F\u002Ftechvoyage.dev\u002FThe_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[445],"The_SpaceX_Comp_Analysis_A_Statistical_Benchmark_of_Growth_Efficiency_and_Valuation_Against_Public_Peers.pdf",[430,11526,11527,11528,11531,11532,11535,11536,11540],{},"ClaudeとQwenのレポートは、どちらも同一スキル内の定義に沿った手順で作成されたものの、取得ソースが異なったため数値に違いが生じました。例えば、Claude Fable 5は",[448,11529,11530],{},"Stock Analysis","からデータを取得したのに対し、Qwenは米国証券取引委員会の",[448,11533,11534],{},"SEC.gov","を使用していました。\n",[433,11537],{"alt":11538,"src":11539},"Claude Fable 5がStock Analysisのウェブページから直接抽出した金融財務指標データ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-data-source-stock-analysis.webp",[433,11541],{"alt":11542,"src":11543},"Qwen deep researchが財務分析に利用したSEC（米国証券取引委員会）の公式ファイリングデータ源","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fqwen-deep-research-data-source-sec-gov.webp",[430,11545,11546],{},"また、Qwenが作成したレポートの方が、SpaceXのビジネスモデル、資本構成、および業務運営（オペレーション）についてより詳細な情報が含まれていました。",[430,11548,11549,11550,11553,11554],{},"これらのレポートを比較した後、私たちはClaudeのデスクトップアプリで ",[491,11551,11552],{},"\u002Fresearch"," コマンドを使って再挑戦することにしました。\n",[433,11555],{"alt":11556,"src":11557},"企業詳細調査のためにClaudeデスクトップアプリで新しい \u002Fresearch コマンドを起動した画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-desktop-research-command-spacex.webp",[430,11559,11560,11561,11566],{},"新しく生成された分析レポート「",[441,11562,11565],{"href":11563,"rel":11564},"https:\u002F\u002Ftechvoyage.dev\u002FSpaceX_Analysis.pdf",[445],"SpaceX_Analysis.pdf","」には、追加の推奨事項や注意書き（免責事項）セクションが盛り込まれていました。しかし、Qwen deep search（ディープサーチ）と比較すると、事業オペレーションや資本構成といった企業自体の詳細情報がまだ不足している印象でした。",[430,11568,11569],{},"Fable 5は、そのプレミアムな価格に見合う価値があるでしょうか？難易度が高く時間のかかるタスクや、自律的なコーディングにおいては、その価値があるかもしれません。しかし、企業分析のような特定のナレッジワークにおいては、現時点では最高のコストパフォーマンスとは言えない可能性があります。",[430,11571,11572,11573,11575,11576,11579,11580],{},"最後に、",[448,11574,11431],{},"が翻訳タスクでどの程度機能するかテストしました。奇妙なことに、翻訳を開始するとモデルが自動的に",[448,11577,11578],{},"Opus 4.8","へとダウングレードされました。\n",[433,11581],{"alt":11582,"src":11583},"翻訳処理中にClaudeデスクトップアプリが自動でFable 5からOpus 4.8モデルに切り替えた状態","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002Fclaude-fable-5-translation-opus-switching.webp",[430,11585,11586],{},"これは、長いコンテキストを処理する変換タスクにおいて、システムが自動的にOpus 4.8へ切り替えてしまうことを意味するのでしょうか？6月22日以前の利用における一時的なバグなのか、あるいは翻訳にはそこまで高性能なモデルが必要ないとシステム側が賢く判断した結果なのでしょうか。",{"title":425,"searchDepth":1067,"depth":1074,"links":11588},[],[1670],"2026-06-11","Anthropicの最新AIモデル「Claude Fable 5」と「Qwen Deep Research」を、SpaceX of の企業比較分析（Comps Analysis）を用いて徹底比較！高度な金融財務分析における両者の詳細な違いを検証し、プレミアムなアップグレード料金に見合う価値があるのか検証します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FTesting%20Claude%20Fable%205%20in%20Financial%20Analysis\u002FJA-Testing-Claude-Fable-5-in-Financial-Analysis.webp","Claude Fable 5対Qwen：AI金融財務分析テスト比較",{"schemaOrg":11595,"robots":1704,"sitemap":11597},[11596],{"@type":1681,"headline":11392,"description":11591},{"lastmod":11590},{"title":11593,"description":11591,"ogTitle":11392,"ogDescription":11591,"twitterTitle":11392,"twitterDescription":11591},"ja\u002Farticle\u002Ftesting-claude-fable-5-in-financial-analysis",[11400,11601,11602,11603],"財務分析","Qwen Deep Research","AIベンチマーク","f8iXwkvoI7ixUPmYgCJ2hojZRdSz72FD5ryqWHgFJ8Y",{"id":11606,"title":11607,"author":1713,"body":11608,"category":11812,"date":11813,"description":11814,"extension":1675,"image":11815,"imageAlt":11816,"isPublished":1070,"meta":11817,"minRead":1074,"navigation":1070,"path":207,"seo":11821,"stem":11822,"tags":11823,"updatedAt":1713,"__hash__":11824},"article\u002Fja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2.md","Google Antigravity 2：BrowserとSchedulerの高度な連携と自動化ガイド",{"type":427,"value":11609,"toc":11807},[11610,11623,11627,11632,11641,11656,11662,11665,11675,11679,11682,11689,11696,11707,11710,11716,11726,11732,11742,11754,11764,11773,11776,11782,11785,11796],[430,11611,11612,11615,11616,1842,11619,11622],{},[448,11613,11614],{},"Google Antigravity 2","の ",[491,11617,11618],{},"\u002Fbrowser",[491,11620,11621],{},"\u002Fschedule"," コマンドは、AIとのインタラクションを再定義します。これら2つのコマンドにより、AntigravityはライブWebと連携し、定期的なワークフローを実行できるプロアクティブな自動化プラットフォームへと進化します。",[472,11624,11626],{"id":11625},"browser-run","Browser Run",[430,11628,11629,11631],{},[491,11630,11618],{}," コマンドを使用すると、タスクを実行するために強制的にChromeブラウザが起動します。ワークフロー中にエージェントがいつ、どのようにWebにアクセスするかは、ユーザーが制御できます。プロセス実行中には、スクリーンショットやビデオクリップが撮影されます。",[430,11633,11634,11637],{},[448,11635,11636],{},"ユースケース：",[433,11638],{"alt":11639,"src":11640},"病気休暇を申請するための\u002Fbrowserコマンドの使用","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-command-sick-leave-prompt.webp",[430,11642,11643,11644,11648,11652],{},"以下はエージェントからの出力結果です：\n",[433,11645],{"alt":11646,"src":11647},"ブラウザ自動化サブエージェントが病気休暇申請タスクを開始","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-subagent-delegation.webp",[433,11649],{"alt":11650,"src":11651},"リモートデバッグと権限を備えたChromeをセットアップするブラウザ自動化ツール","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-permissions-and-chrome-setup.webp",[433,11653],{"alt":11654,"src":11655},"ユーザー認証情報を要求するログイン画面で一時停止するブラウザサブエージェント","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-login-wall-encountered.webp",[430,11657,11658],{},[433,11659],{"alt":11660,"src":11661},"ユーザーがログインプロセスを完了するのを待っているブラウザサブエージェント","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-waiting-for-user-login.webp",[430,11663,11664],{},"Antigravityはページを開いてフォームを送信することができました。ログインが必要な場合、エージェントはユーザーがウェブサイトにログインするまで待機します。",[430,11666,11667,11672,11674],{},[11668,11669],"video",{"alt":11670,"src":11671,"controls":1070},"病気休暇申請プロセスを実行するブラウザサブエージェントの動画","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fbrowser-automation-sick-leave-process.webm",[491,11673,11618],{}," コマンドは、タスク完了のために最新のWebドキュメント、変更履歴（チェンジログ）、Webアプリケーションのテスト、またはAPIステータスの確認が必要な場合に非常に便利です。",[472,11676,11678],{"id":11677},"schedule-task","Schedule Task",[430,11680,11681],{},"Antigravity 2には、タスクをスケジュールするための機能が組み込まれています。今回は、10分ごとにタイムシートを自動入力するテストを行ってみます。",[430,11683,11684,11685],{},"「Scheduled Tasks（スケジュールされたタスク）」をクリックします：\n",[433,11686],{"alt":11687,"src":11688},"サイドバーのスケジュールされたタスクのメニューオプション","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-menu-item.webp",[430,11690,11691,11692],{},"「+ New」ボタンをクリックして、新しいスケジュールタスクを作成します：\n",[433,11693],{"alt":11694,"src":11695},"新しいタスクボタンのある空のスケジュールされたタスクビュー","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-empty-state-new-button.webp",[430,11697,11698,11699,11703],{},"フォームを入力し、10分ごとに実行されるようにスケジュールを設定します：\n",[433,11700],{"alt":11701,"src":11702},"自動タイムシート入力用に記入された新しいスケジュールされたタスクのフォーム","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-new-task-form.webp",[433,11704],{"alt":11705,"src":11706},"スケジュールされたタスクリスト内のアクティブな自動タイムシート入力タスク","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-active-task-list.webp",[430,11708,11709],{},"タスクはトリガーされましたが、エラーが発生しました。",[430,11711,11712],{},[433,11713],{"alt":11714,"src":11715},"フラッシュ階層に利用可能なモデルが見つからないことを示すエラーメッセージ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-error-no-models.webp",[430,11717,11718,11721,11722,11725],{},[491,11719,11720],{},".gemini\u002Fconfig\u002Fsidecars\u002Fauto-timesheet-entry"," にある ",[491,11723,11724],{},"sidecar.json"," ファイルに「env」値を追加してみましたが、同じエラーが発生し続けました。",[930,11727,11730],{"className":11728,"code":11729,"language":4636},[4634],"    \"env\": {\n        \"GEMINI_MODEL\": \"gemini-3.5-flash\",\n        \"GOOGLE_CLOUD_PROJECT\": \"your-gcp-project-id\"\n    }\n",[491,11731,11729],{"__ignoreMap":425},[430,11733,11734,11737,11738,11741],{},[491,11735,11736],{},".gemini\u002Fantigravity\u002Fsidecar_data\u002F"," にあるスケジュールタスクのログを調査すると、",[491,11739,11740],{},"[schedule] Triggering command: \"agentapi\" [new-conversation]"," という記述が確認できます。",[430,11743,11744,11749,11750,11753],{},[441,11745,11748],{"href":11746,"rel":11747},"https:\u002F\u002Fdiscuss.ai.google.dev\u002Ft\u002Fscheduled-tasks-in-antigravity-2-ended-with-errors\u002F168013",[445],"Build with Google AIフォーラム","に投稿した問題への回答によると、",[491,11751,11752],{},"agentapi"," にはAPIキーが必要とのことです。APIキーを使用してみましたが、やはり解決しませんでした。",[430,11755,11756,11757,11759,11760],{},"会話ボックスで直接 ",[491,11758,11621],{}," コマンドを入力して再試行しました。\n",[433,11761],{"alt":11762,"src":11763},"タイムシート自動化タスクをプロンプトするための\u002Fscheduleコマンドの使用","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fschedule-command-timesheet-prompt.webp",[430,11765,11766,11768,11769],{},[491,11767,11621],{}," コマンドを使用してスケジュールされたタスクは、「Scheduled Tasks」メニュー項目には表示されません。\n",[433,11770],{"alt":11771,"src":11772},"CLIコマンドを介して作成されたタスクが表示されないスケジュールされたタスクリスト","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fscheduled-tasks-list-missing-cli-task.webp",[430,11774,11775],{},"cronタスクは無事にトリガーされました。",[430,11777,11778],{},[433,11779],{"alt":11780,"src":11781},"トリガーされたことを確認するcronジョブのログ","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002Fcron-job-triggered-log.webp",[472,11783,11784],{"id":11784},"最後に",[430,11786,11787,11788,1842,11790,11792,11793,11795],{},"Antigravity 2の ",[491,11789,11618],{},[491,11791,11621],{}," コマンドは、単に独立した機能というだけではなく、これらを組み合わせることで真の真価を発揮します。例えば、毎週月曜日の朝6:00に、エージェントが ",[491,11794,11618],{}," を使ってニュースや情報サイトを巡回し、情報を要約して、包括的なデイリーレポートを届けるようにスケジュールすることができます。",[430,11797,11798,11799,11802,11803,11806],{},"新しいスケジュールタスクを設計する際には、",[491,11800,11801],{},"\u002Fgrill-me"," などの他のコマンド（記事「",[441,11804,11805],{"href":419},"Antigravity 2を使いこなす：AIエージェント、スキル、MCPサーバーによるフルスタック開発","」で解説）も活用できます。このコマンドは、設計を確定する前に、エージェントが曖昧な点を質問して明確にし、エッジケースを洗い出すよう促します。",{"title":425,"searchDepth":1067,"depth":1074,"links":11808},[11809,11810,11811],{"id":11625,"depth":1067,"text":11626},{"id":11677,"depth":1067,"text":11678},{"id":11784,"depth":1067,"text":11784},[1670],"2026-06-07","Google Antigravity 2の\u002Fbrowserと\u002Fscheduleコマンドを活用し、Web連携や定時処理を行う強力なAI自動化プラットフォームを構築する方法を解説。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FUse%20Browser%20and%20Scheduler%20in%20Antigravity%202\u002FJA-Use-Browser-and-Scheduler-in-Antigravity-2.webp","Google Antigravity 2: Browser & Schedule 自動化解説",{"schemaOrg":11818,"robots":1704,"sitemap":11820},[11819],{"@type":1681,"headline":11816,"description":11814},{"lastmod":11813},{"title":11816,"description":11814,"ogTitle":11607,"ogDescription":11814,"twitterTitle":11607,"twitterDescription":11814},"ja\u002Farticle\u002Fuse-browser-and-scheduler-in-antigravity-2",[],"ABXPXeZ0dfidgqC7c5cEvfpDG6_wMyzRwxx2ZC5MtMQ",{"id":11826,"title":11805,"author":425,"body":11827,"category":12152,"date":12153,"description":12154,"extension":1675,"image":12155,"imageAlt":12156,"isPublished":1070,"meta":12157,"minRead":1067,"navigation":1070,"path":211,"seo":12161,"stem":12162,"tags":12163,"updatedAt":1713,"__hash__":12164},"article\u002Fja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2.md",{"type":427,"value":11828,"toc":12142},[11829,11832,11838,11841,11847,11850,11854,11860,11863,11869,11875,11881,11893,11898,11902,11910,11914,11920,11926,11932,11935,11941,11947,11952,11957,11960,11964,11973,11979,11983,11989,11995,12001,12004,12008,12011,12015,12021,12027,12033,12036,12116,12122,12134,12136,12139],[430,11830,11831],{},"Antigravity 2は、エージェントファーストのデスクトップアプリケーションとして、ユーザーがサブエージェントのチームを編成し、メールやカレンダーから毎日の要約（ブリーフ）を生成したり、アプリケーションの構築、テスト、デプロイを行ったりすることを可能にします。しかし、これは実際の運用において、具体的にどのような動作として現れるのでしょうか？",[430,11833,11834,11835,5722],{},"組み込みのコマンドやスキル（Skills）から、Firebase Model Context Protocol（MCP）サーバーのような統合機能が開発者をフルスタックアーキテクトへとどのように変貌させるのかまで、Antigravity 2が提供する数々の可能性を探っていきましょう。スキルやMCPサーバー of セットアップおよび設定方法については、こちらの解説記事",[441,11836,11837],{"href":391},"Google Antigravity 2 徹底解説：初期セットアップ手順と実機ファーストインプレッション",[472,11839,11840],{"id":11840},"組み込みコマンド",[885,11842,11844],{"id":11843},"goal",[491,11845,11846],{},"\u002Fgoal",[430,11848,11849],{},"このコマンドを使用すると、指定した特定のタスクが完全に完了するまでエージェントを実行させ続けることができます。",[430,11851,11852],{},[448,11853,11636],{},[430,11855,11856],{},[433,11857],{"alt":11858,"src":11859},"Textrisゲームを作成するためのAntigravity 2のgoalコマンドのプロンプト","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-goal-command-prompt.webp",[430,11861,11862],{},"動的なサブエージェントの起動を要求すると、タスクを完遂するために3つのサブエージェントが生成されます。",[430,11864,11865],{},[433,11866],{"alt":11867,"src":11868},"タスクを自律的に完了するためにサブエージェントを生成するAntigravity 2","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-1.webp",[430,11870,11871],{},[433,11872],{"alt":11873,"src":11874},"ステップを実行するAntigravity 2のサブエージェントの詳細な進捗","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-2.webp",[430,11876,11877],{},[433,11878],{"alt":11879,"src":11880},"Antigravity 2のサブエージェントによる自律タスクの完了","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-spawning-subagents-3.webp",[430,11882,11883,11884,11888,11889],{},"生成されたHTMLベースのTextris（テトリス）ゲームをプレイするには、こちらの",[441,11885,11887],{"href":11886},"\u002Ftextris","リンク","をクリックしてください：\n",[11668,11890],{"alt":11891,"src":11892,"controls":1070},"AI generated Textris game in HTML","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fai-generated-textri-game-html.webm",[430,11894,11895,11897],{},[491,11896,11846],{}," コマンドは計画を策定し、それを段階的に実行しながら、各ステージの進捗状況をリアルタイムで報告します。さらに、エージェントは上限を超えないよう、コンテキストウィンドウ自体を自律的に管理します。これは、パフォーマンスの最適化やモジュールのリファクタリングなど、複数回の繰り返しプロセスを必要とする長期のタスクに最適です。",[885,11899,11900],{"id":9969},[491,11901,11801],{},[430,11903,11904,11905,11909],{},"このコマンドは、Matt Pocock氏が作成したスキル",[441,11906,9969],{"href":11907,"rel":11908},"https:\u002F\u002Fgithub.com\u002Fmattpocock\u002Fskills\u002Fblob\u002Fmain\u002Fskills\u002Fproductivity\u002Fgrill-me\u002FSKILL.md",[445],"を呼び出します。簡潔でありながら非常に効果的なスキルです。実装前に、複数の側面からユーザーに質問を投げかけ、エッジケースを明確にし、構造を整合させ、計画を最終決定するという設計思想に基づいています。",[430,11911,11912],{},[448,11913,11636],{},[430,11915,11916],{},[433,11917],{"alt":11918,"src":11919},"Antigravity 2でCloudflareアーキテクチャのgrill-meコマンドをトリガーする","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-command-prompt.webp",[430,11921,11922],{},[433,11923],{"alt":11924,"src":11925},"grill-meスキルを使用したインタラクティブな質疑応答セッション","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-1.webp",[430,11927,11928],{},[433,11929],{"alt":11930,"src":11931},"エッジケースの明確化とgrill-meによる計画の構造化","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-interaction-2.webp",[430,11933,11934],{},"複数選択（マルチセレクト）機能にも対応しています：",[430,11936,11937],{},[433,11938],{"alt":11939,"src":11940},"grill-meプロセス中の複数選択機能の使用","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-1.webp",[430,11942,11943],{},[433,11944],{"alt":11945,"src":11946},"grill-meの複数選択機能で選択を確定する","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-grill-me-multi-select-2.webp",[430,11948,11949,11951],{},[491,11950,11801],{}," コマンドの実力は極めて印象的です。Cloudflareへのデプロイに関するアーキテクチャ設計のほぼすべての側面をカバーしています。このため、アプリの設計、複数ドメインにわたるリファクタリング、その他複雑なシステム構築のプランニングに非常に適しています。",[885,11953,11954],{"id":425},[491,11955,11956],{},"@\u002F ",[430,11958,11959],{},"このコマンドは利用可能なリストには表示されませんが、コンテキストウィンドウの管理において重宝します。会話ボックスに（メディア以外の）フォルダーやファイルを追加するために使用されます。",[472,11961,11963],{"id":11962},"スキルskills","スキル（Skills）",[430,11965,1120,11966,11969,11970,11972],{},[491,11967,11968],{},"\u002F","」を入力することでポップアップボックスが開き、特定のスキルを選択できます。ここでは、",[491,11971,10158],{}," をテストしてみましょう。",[430,11974,11975],{},[433,11976],{"alt":11977,"src":11978},"AntigravityのポップアップボックスからExcalidraw図スキルを選択する","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-skill-selection-excalidraw.webp",[430,11980,11981],{},[448,11982,11636],{},[430,11984,11985],{},[433,11986],{"alt":11987,"src":11988},"Excalidraw図を生成するための指示を提供する","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-prompt.webp",[430,11990,11991],{},[433,11992],{"alt":11993,"src":11994},"Excalidrawアーキテクチャ図の生成に成功","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-excalidraw-diagram-generation.webp",[430,11996,11997],{},[433,11998],{"alt":11999,"src":12000},"Antigravity architecture diagram","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-architecture.webp",[430,12002,12003],{},"数回にわたるシステム実行権限の確認を終えた後、スキルは無事に実行されました。",[472,12005,12007],{"id":12006},"mcpサーバー","MCPサーバー",[430,12009,12010],{},"開発者がバックエンドを構築する際、通常はWebコンソールを開き、データベースを作成し、APIキーをコピーして貼り付けるという手作業が発生します。AntigravityにMCPサーバーを直接統合することで、エージェントはクラウドインフラを自律的に操作するための「手」を手に入れることができます。",[430,12012,12013],{},[448,12014,11636],{},[430,12016,12017],{},[433,12018],{"alt":12019,"src":12020},"Firebase Webアプリケーションを作成するようにMCPサーバーに指示する","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-prompt.webp",[430,12022,12023],{},[433,12024],{"alt":12025,"src":12026},"MCPサーバーを使用してFirebaseインフラストラクチャを操作するAntigravity","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-1.webp",[430,12028,12029],{},[433,12030],{"alt":12031,"src":12032},"Antigravity MCPサーバーを介したFirebaseアプリの作成の成功","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-mcp-server-firebase-execution-2.webp",[430,12034,12035],{},"エージェントはMCPサーバーを駆使して、Firebase上にWebアプリを構築することに成功しました。作成されたリポジトリを確認してみましょう。",[930,12037,12039],{"className":1038,"code":12038,"language":1040,"meta":425,"style":425},"Create a new public GitHub repository called ‘to-do-app-techvoyage’. Then push all the current project files to it with the commit message ‘Initial commit — to-do-app’.\n",[491,12040,12041],{"__ignoreMap":425},[938,12042,12043,12046,12049,12052,12055,12058,12061,12064,12067,12070,12073,12076,12079,12082,12085,12088,12091,12094,12097,12099,12102,12105,12108,12110,12113],{"class":940,"line":941},[938,12044,12045],{"class":1047},"Create",[938,12047,12048],{"class":1051}," a",[938,12050,12051],{"class":1051}," new",[938,12053,12054],{"class":1051}," public",[938,12056,12057],{"class":1051}," GitHub",[938,12059,12060],{"class":1051}," repository",[938,12062,12063],{"class":1051}," called",[938,12065,12066],{"class":1051}," ‘to-do-app-techvoyage’.",[938,12068,12069],{"class":1051}," Then",[938,12071,12072],{"class":1051}," push",[938,12074,12075],{"class":1051}," all",[938,12077,12078],{"class":1051}," the",[938,12080,12081],{"class":1051}," current",[938,12083,12084],{"class":1051}," project",[938,12086,12087],{"class":1051}," files",[938,12089,12090],{"class":1051}," to",[938,12092,12093],{"class":1051}," it",[938,12095,12096],{"class":1051}," with",[938,12098,12078],{"class":1051},[938,12100,12101],{"class":1051}," commit",[938,12103,12104],{"class":1051}," message",[938,12106,12107],{"class":1051}," ‘Initial",[938,12109,12101],{"class":1051},[938,12111,12112],{"class":1051}," —",[938,12114,12115],{"class":1051}," to-do-app’.\n",[430,12117,12118],{},[433,12119],{"alt":12120,"src":12121},"プロジェクトファイルを新しいGitHubリポジトリに自動的にプッシュするエージェント","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002Fantigravity-github-repository-push.webp",[430,12123,12124,12125,12128,12129,12133],{},"GitHub上に公開された ",[491,12126,12127],{},"to-do-app-techvoyage"," リポジトリは、こちらの",[441,12130,11887],{"href":12131,"rel":12132},"https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fto-do-app-techvoyage",[445],"からアクセスできます。",[472,12135,11784],{"id":11784},[430,12137,12138],{},"Gemini 3.5 Flashを搭載したAntigravity 2のMCPやスキルは、驚異的な処理スピードを実現しています。しかしその一方で、現在のエージェントフローは頻繁なアクセス権限の承認要求や、問題発生時のロールバックを行うためのチェックポイント機能の欠如がボトルネックとなっています。このチェックポイント機能が正式に導入されるまでは、こまめな「Gitコミット」こそが、開発者の身を守る必須の安全網となるでしょう。",[1650,12140,12141],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":425,"searchDepth":1067,"depth":1074,"links":12143},[12144,12149,12150,12151],{"id":11840,"depth":1067,"text":11840,"children":12145},[12146,12147,12148],{"id":11843,"depth":1074,"text":11846},{"id":9969,"depth":1074,"text":11801},{"id":425,"depth":1074,"text":11956},{"id":11962,"depth":1067,"text":11963},{"id":12006,"depth":1067,"text":12007},{"id":11784,"depth":1067,"text":11784},[1670],"2026-06-06","エージェントファーストのデスクトップアプリ「Antigravity 2」を徹底解説。AIサブエージェントの調整、スキル、MCPサーバーの活用方法を紹介します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FWhat%20can%20we%20do%20with%20Antigravity%202\u002FJA-What-can-we-do-with-Antigravity-2.webp","Antigravity 2チュートリアル：AIエージェント、スキル、MCP連携ガイド",{"schemaOrg":12158,"robots":1704,"sitemap":12160},[12159],{"@type":1681,"headline":11805,"description":12154},{"lastmod":12153},{"title":12156,"description":12154,"ogTitle":11805,"ogDescription":12154,"twitterTitle":11805,"twitterDescription":12154},"ja\u002Farticle\u002Fwhat-can-we-do-with-antigravity-2",[],"3cusyNd3nFqYFS-aSwWz8_fEQUk8322IPWzeQBPPAYc",{"id":12166,"title":11837,"author":1713,"body":12167,"category":12821,"date":12822,"description":12823,"extension":1675,"image":12824,"imageAlt":12825,"isPublished":1070,"meta":12826,"minRead":2277,"navigation":1070,"path":197,"seo":12830,"stem":12831,"tags":12832,"updatedAt":1713,"__hash__":12833},"article\u002Fja\u002Farticle\u002Fsetup-antigravity-2.md",{"type":427,"value":12168,"toc":12810},[12169,12180,12182,12185,12196,12199,12203,12211,12217,12224,12230,12233,12243,12245,12249,12252,12258,12261,12267,12271,12274,12282,12296,12303,12315,12325,12339,12341,12345,12348,12361,12364,12669,12676,12682,12685,12691,12694,12700,12702,12706,12717,12729,12735,12741,12747,12764,12767,12773,12775,12779,12782,12788,12791,12797,12799,12801,12804,12807],[430,12170,12171,12172,12175,12176,12179],{},"Google I\u002FO 2026において、Googleは",[448,12173,12174],{},"Antigravity 2","を発表しました。これは",[448,12177,12178],{},"エージェント","を第一のユーザーインターフェースとして位置づけた、独立したデスクトップアプリケーションです。ユーザーが達成したい内容を説明するだけで、エージェントが自動的に計画を立て、管理しやすいサブタスクに分解した上で実行してくれます。",[885,12181,1765],{"id":1765},[430,12183,12184],{},"始める前に必要なもの：",[481,12186,12187,12190,12193],{},[484,12188,12189],{},"PC（本ガイドではmacOSを使用）",[484,12191,12192],{},"モダンなウェブブラウザ",[484,12194,12195],{},"Gmailアカウント",[12197,12198],"hr",{},[472,12200,12202],{"id":12201},"_1-antigravity-2のインストール","1. Antigravity 2のインストール",[430,12204,12205,12210],{},[441,12206,12209],{"href":12207,"rel":12208},"https:\u002F\u002Fantigravity.google\u002Fdownload",[445],"antigravity.google"," からAntigravity 2をダウンロードし、お使いのPCにインストールします。最初の起動時に、Gmailアカウントを使用したサインインを求められます。",[430,12212,12213],{},[433,12214],{"alt":12215,"src":12216},"Antigravity 2の初回起動時におけるGoogleアカウントログイン画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-gmail-login.webp",[430,12218,12219,12220,12223],{},"サインインすると、入力フィールドに",[448,12221,12222],{},"音声ボタン","が表示され、キーボードで入力する代わりに音声プロンプトを録音できるようになります。",[430,12225,12226],{},[433,12227],{"alt":12228,"src":12229},"Antigravity 2のテキスト入力欄に表示される音声入力・録音ボタン","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-voice-input-field.webp",[430,12231,12232],{},"また、Antigravity 2では新たに**「プロジェクト（Project）」**という概念が導入されました。これにより、複数のローカルフォルダを横断し、それぞれに固有のエージェント設定や権限を適用して動作させることができます。",[430,12234,12235,12239],{},[433,12236],{"alt":12237,"src":12238},"Antigravity 2の設定画面におけるプロジェクト選択・構成メニュー","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-menu.webp",[433,12240],{"alt":12241,"src":12242},"Antigravity 2におけるフォルダパスを指定した新規AIプロジェクト作成画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-project-creation.webp",[12197,12244],{},[472,12246,12248],{"id":12247},"_2-mcpとプラグインの設定","2. MCPとプラグインの設定",[430,12250,12251],{},"Model Context Protocol（MCP）サーバー、プラグイン、スキルはすべて、設定メニューの**「Customizations（カスタマイズ）」**セクションで管理します：",[430,12253,12254],{},[433,12255],{"alt":12256,"src":12257},"MCPサーバーやスキルを管理する「Customizations」設定タブ画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-settings-customizations.webp",[430,12259,12260],{},"現在、利用可能なプラグインはGoogle公式のものだけですが、将来的にはより多くのプラグインがリリースされることが期待されます。",[430,12262,12263],{},[433,12264],{"alt":12265,"src":12266},"Antigravity 2で利用可能なGoogle公式プラグインと連携一覧","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-google-plugins-list.webp",[2166,12268,12270],{"id":12269},"利用可能なmcpサーバーの追加","利用可能なMCPサーバーの追加",[430,12272,12273],{},"事前に構成されたMCPサーバー（例：GitHub）をインストールするには：",[529,12275,12276,12279],{},[484,12277,12278],{},"**「Add MCP+」**をクリックします。",[484,12280,12281],{},"**「GitHub MCP Server」**を選択します。",[430,12283,12284,12288,12292],{},[433,12285],{"alt":12286,"src":12287},"「Add MCP+」ボタンをクリックして構成済みMCPサーバーを追加する手順","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-mcp-button.webp",[433,12289],{"alt":12290,"src":12291},"利用可能な連携リストからGitHub MCP Serverを選択する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-select-github-mcp.webp",[433,12293],{"alt":12294,"src":12295},"GitHub MCP Serverの認証およびインストール構成ウィザード画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-setup.webp",[430,12297,12298,12299],{},"GitHub MCPサーバーのセットアップはエラーで終了しました：\n",[433,12300],{"alt":12301,"src":12302},"GitHub MCP Serverのインストールプロセス中に発生した構成エラー画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-github-mcp-error.webp",[430,12304,12305,12306,12308,12309,12311,12312,12314],{},"macOSにすでに",[491,12307,2794],{},"がインストールされているため、チャット内で直接",[491,12310,2794],{},"コマンドを実行することでこの問題を回避できます。ただし、まずAntigravityの権限に",[491,12313,2794],{},"コマンドを明示的に追加する必要があります。",[430,12316,12317,12321],{},[433,12318],{"alt":12319,"src":12320},"サンドボックス権限にgitコマンドを追加するための要求ダイアログ画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-1.webp",[433,12322],{"alt":12323,"src":12324},"設定メニューでgitコマンドの実行権限を明示的に付与する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-add-git-permission-2.webp",[430,12326,12327,12328,12330,12331,12335],{},"プロンプトをテストして、",[491,12329,2794],{},"コマンドが機能するか確認してみましょう：\n",[433,12332],{"alt":12333,"src":12334},"AIエージェントのプロンプト入力欄でgit status要求を送信する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-1.webp",[433,12336],{"alt":12337,"src":12338},"チャット内でgit statusコマンドの実行に成功したターミナル画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-git-command-test-2.webp",[12197,12340],{},[472,12342,12344],{"id":12343},"_3-カスタムmcpサーバーの追加","3. カスタムMCPサーバーの追加",[430,12346,12347],{},"利用したいMCPサーバーがデフォルトのリストにない場合は、MCP設定ファイルを直接編集して追加できます。設定ファイルは以下の場所にあります：",[930,12349,12351],{"className":1038,"code":12350,"language":1040,"meta":425,"style":425},"~\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[491,12352,12353],{"__ignoreMap":425},[938,12354,12355,12358],{"class":940,"line":941},[938,12356,12357],{"class":952},"~",[938,12359,12360],{"class":948},"\u002F.gemini\u002Fconfig\u002Fmcp_config.json\n",[430,12362,12363],{},"例として、CloudflareのMCPサーバーをいくつか追加してみましょう。Cloudflareは動的なクライアント登録をサポートしているため、OAuthを有効にするだけで済みます。JSON設定ファイルに以下を追加してください：",[930,12365,12367],{"className":2912,"code":12366,"language":2914,"meta":425,"style":425},"    \"cloudflare-api\": {\n      \"serverUrl\": \"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-docs\": {\n      \"serverUrl\": \"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp\"\n    },\n    \"cloudflare-bindings\": {\n      \"serverUrl\": \"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-builds\": {\n      \"serverUrl\": \"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    },\n    \"cloudflare-observability\": {\n      \"serverUrl\": \"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp\",\n      \"oauth\": {\n        \"enabled\": true\n      }\n    }\n",[491,12368,12369,12382,12402,12414,12426,12430,12437,12450,12467,12473,12486,12505,12517,12529,12533,12539,12552,12571,12583,12595,12599,12605,12618,12637,12649,12661,12665],{"__ignoreMap":425},[938,12370,12371,12373,12376,12378,12380],{"class":940,"line":941},[938,12372,7468],{"class":952},[938,12374,12375],{"class":1051},"cloudflare-api",[938,12377,3687],{"class":952},[938,12379,7461],{"class":948},[938,12381,2921],{"class":952},[938,12383,12384,12386,12389,12391,12393,12395,12398,12400],{"class":940,"line":1067},[938,12385,7481],{"class":952},[938,12387,12388],{"class":944},"serverUrl",[938,12390,3687],{"class":952},[938,12392,1366],{"class":952},[938,12394,3285],{"class":952},[938,12396,12397],{"class":1051},"https:\u002F\u002Fmcp.cloudflare.com\u002Fmcp",[938,12399,3687],{"class":952},[938,12401,7498],{"class":952},[938,12403,12404,12406,12408,12410,12412],{"class":940,"line":1074},[938,12405,7481],{"class":952},[938,12407,7713],{"class":944},[938,12409,3687],{"class":952},[938,12411,1366],{"class":952},[938,12413,2951],{"class":952},[938,12415,12416,12418,12420,12422,12424],{"class":940,"line":1081},[938,12417,7517],{"class":952},[938,12419,7726],{"class":1047},[938,12421,3687],{"class":952},[938,12423,1366],{"class":952},[938,12425,1388],{"class":952},[938,12427,12428],{"class":940,"line":1933},[938,12429,7737],{"class":952},[938,12431,12432,12435],{"class":940,"line":1938},[938,12433,12434],{"class":952},"    }",[938,12436,7498],{"class":948},[938,12438,12439,12441,12444,12446,12448],{"class":940,"line":1944},[938,12440,7468],{"class":952},[938,12442,12443],{"class":1051},"cloudflare-docs",[938,12445,3687],{"class":952},[938,12447,7461],{"class":948},[938,12449,2921],{"class":952},[938,12451,12452,12454,12456,12458,12460,12462,12465],{"class":940,"line":2277},[938,12453,7481],{"class":952},[938,12455,12388],{"class":944},[938,12457,3687],{"class":952},[938,12459,1366],{"class":952},[938,12461,3285],{"class":952},[938,12463,12464],{"class":1051},"https:\u002F\u002Fdocs.mcp.cloudflare.com\u002Fmcp",[938,12466,1965],{"class":952},[938,12468,12469,12471],{"class":940,"line":2288},[938,12470,12434],{"class":952},[938,12472,7498],{"class":948},[938,12474,12475,12477,12480,12482,12484],{"class":940,"line":2384},[938,12476,7468],{"class":952},[938,12478,12479],{"class":1051},"cloudflare-bindings",[938,12481,3687],{"class":952},[938,12483,7461],{"class":948},[938,12485,2921],{"class":952},[938,12487,12488,12490,12492,12494,12496,12498,12501,12503],{"class":940,"line":2390},[938,12489,7481],{"class":952},[938,12491,12388],{"class":944},[938,12493,3687],{"class":952},[938,12495,1366],{"class":952},[938,12497,3285],{"class":952},[938,12499,12500],{"class":1051},"https:\u002F\u002Fbindings.mcp.cloudflare.com\u002Fmcp",[938,12502,3687],{"class":952},[938,12504,7498],{"class":952},[938,12506,12507,12509,12511,12513,12515],{"class":940,"line":2396},[938,12508,7481],{"class":952},[938,12510,7713],{"class":944},[938,12512,3687],{"class":952},[938,12514,1366],{"class":952},[938,12516,2951],{"class":952},[938,12518,12519,12521,12523,12525,12527],{"class":940,"line":2401},[938,12520,7517],{"class":952},[938,12522,7726],{"class":1047},[938,12524,3687],{"class":952},[938,12526,1366],{"class":952},[938,12528,1388],{"class":952},[938,12530,12531],{"class":940,"line":2407},[938,12532,7737],{"class":952},[938,12534,12535,12537],{"class":940,"line":1706},[938,12536,12434],{"class":952},[938,12538,7498],{"class":948},[938,12540,12541,12543,12546,12548,12550],{"class":940,"line":3364},[938,12542,7468],{"class":952},[938,12544,12545],{"class":1051},"cloudflare-builds",[938,12547,3687],{"class":952},[938,12549,7461],{"class":948},[938,12551,2921],{"class":952},[938,12553,12554,12556,12558,12560,12562,12564,12567,12569],{"class":940,"line":3369},[938,12555,7481],{"class":952},[938,12557,12388],{"class":944},[938,12559,3687],{"class":952},[938,12561,1366],{"class":952},[938,12563,3285],{"class":952},[938,12565,12566],{"class":1051},"https:\u002F\u002Fbuilds.mcp.cloudflare.com\u002Fmcp",[938,12568,3687],{"class":952},[938,12570,7498],{"class":952},[938,12572,12573,12575,12577,12579,12581],{"class":940,"line":3377},[938,12574,7481],{"class":952},[938,12576,7713],{"class":944},[938,12578,3687],{"class":952},[938,12580,1366],{"class":952},[938,12582,2951],{"class":952},[938,12584,12585,12587,12589,12591,12593],{"class":940,"line":3901},[938,12586,7517],{"class":952},[938,12588,7726],{"class":1047},[938,12590,3687],{"class":952},[938,12592,1366],{"class":952},[938,12594,1388],{"class":952},[938,12596,12597],{"class":940,"line":3907},[938,12598,7737],{"class":952},[938,12600,12601,12603],{"class":940,"line":3916},[938,12602,12434],{"class":952},[938,12604,7498],{"class":948},[938,12606,12607,12609,12612,12614,12616],{"class":940,"line":4567},[938,12608,7468],{"class":952},[938,12610,12611],{"class":1051},"cloudflare-observability",[938,12613,3687],{"class":952},[938,12615,7461],{"class":948},[938,12617,2921],{"class":952},[938,12619,12620,12622,12624,12626,12628,12630,12633,12635],{"class":940,"line":5017},[938,12621,7481],{"class":952},[938,12623,12388],{"class":944},[938,12625,3687],{"class":952},[938,12627,1366],{"class":952},[938,12629,3285],{"class":952},[938,12631,12632],{"class":1051},"https:\u002F\u002Fobservability.mcp.cloudflare.com\u002Fmcp",[938,12634,3687],{"class":952},[938,12636,7498],{"class":952},[938,12638,12639,12641,12643,12645,12647],{"class":940,"line":5026},[938,12640,7481],{"class":952},[938,12642,7713],{"class":944},[938,12644,3687],{"class":952},[938,12646,1366],{"class":952},[938,12648,2951],{"class":952},[938,12650,12651,12653,12655,12657,12659],{"class":940,"line":5034},[938,12652,7517],{"class":952},[938,12654,7726],{"class":1047},[938,12656,3687],{"class":952},[938,12658,1366],{"class":952},[938,12660,1388],{"class":952},[938,12662,12663],{"class":940,"line":5042},[938,12664,7737],{"class":952},[938,12666,12667],{"class":940,"line":5047},[938,12668,7601],{"class":952},[430,12670,12671,12672,12675],{},"アプリの**「Customizations」",[448,12673,12674],{},"セクションに戻り、","「Refresh（更新）」**ボタンをクリックします。これで、認証待ち（pending authorisation）としてリストにCloudflareのMCPサーバーが表示されます。",[430,12677,12678],{},[433,12679],{"alt":12680,"src":12681},"カスタマイズメニューで認証待ち状態として表示されたCloudflare MCPサーバー一覧","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-mcp-pending.webp",[430,12683,12684],{},"MCPサーバーの横にある**「Authenticate（認証）」**をクリックします。これにより、ウェブブラウザで認証ページが開きます。認証が完了すると、**認証コード（auth code）**が生成されます。",[430,12686,12687],{},[433,12688],{"alt":12689,"src":12690},"ブラウザに表示されたCloudflare MCP連携用の動的OAuth認証コード画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-code.webp",[430,12692,12693],{},"この認証コードをコピーし、Antigravityのテキスト入力フィールドに貼り付けて**「Submit」**をクリックします。",[430,12695,12696],{},[433,12697],{"alt":12698,"src":12699},"コピーしたOAuth認証コードをAntigravityの入力欄に貼り付けて送信する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-cloudflare-auth-submit.webp",[12197,12701],{},[472,12703,12705],{"id":12704},"_4-カスタムスキルの追加","4. カスタムスキルの追加",[430,12707,12708,12709,12712,12713,12716],{},"現時点では、カスタムスキルの追加をデスクトップアプリのUIから直接行うことは",[448,12710,12711],{},"できません","。代わりに、",[491,12714,12715],{},"~\u002F.gemini\u002Fconfig\u002Fskills","フォルダに直接追加する必要があります。",[430,12718,12719,12720,12723,12724],{},"私たちは",[491,12721,12722],{},"npx skills"," CLIを使用してすべてのエージェントスキルを一元管理しているため、新しく追加されたスキルはAntigravityを含むすべてのエージェントで利用可能になります。",[905,12725,12726,12727,4433],{},"(これについての詳細は、こちらの記事を参照してください：",[441,12728,8544],{"href":359},[430,12730,12731,12732,12734],{},"最初、会話ボックスに",[491,12733,11968],{},"を入力しても、スキルリストは空のままです：",[430,12736,12737],{},[433,12738],{"alt":12739,"src":12740},"スラッシュを入力してもカスタムスキルの候補リストが空として表示される画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-empty-skills-list.webp",[430,12742,12743,12744,12746],{},"Antigravity 2はグローバルなスキルフォルダ（",[491,12745,8529],{},"）を自動的に読み込まないようです。これを修正するには、Antigravityの設定ディレクトリを指すシンボリックリンクを作成する必要があります：",[930,12748,12750],{"className":1038,"code":12749,"language":1040,"meta":425,"style":425},"ln -s ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[491,12751,12752],{"__ignoreMap":425},[938,12753,12754,12756,12758,12761],{"class":940,"line":941},[938,12755,3673],{"class":1047},[938,12757,3529],{"class":1051},[938,12759,12760],{"class":1051}," ~\u002F.agents\u002Fskills\u002Fexcalidraw-diagram",[938,12762,12763],{"class":1051}," ~\u002F.gemini\u002Fconfig\u002Fskills\u002Fexcalidraw-diagram\n",[430,12765,12766],{},"リンクが作成されると、アプリケーション内でスキルが利用可能になります！",[430,12768,12769],{},[433,12770],{"alt":12771,"src":12772},"シンボリックリンク作成後にExcalidrawスキルが候補リストに表示された画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-excalidraw-skill-available.webp",[12197,12774],{},[472,12776,12778],{"id":12777},"_5-簡単なタスクのテスト","5. 簡単なタスクのテスト",[430,12780,12781],{},"すべての設定が完了したので、テストを実行してみましょう。",[430,12783,12784],{},[433,12785],{"alt":12786,"src":12787},"Cloudflare経由でD1データベース一覧を取得する测试任务を入力・送信する画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-simple-task-prompt.webp",[430,12789,12790],{},"以下に示すように、モデルは新しく追加されたCloudflareのMCPサーバーを自動的に検出し、それを利用してリクエストを処理することに成功しました。",[430,12792,12793],{},[433,12794],{"alt":12795,"src":12796},"Cloudflare MCPを呼び出してD1データベース一覧の取得に成功した実行結果画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002Fantigravity-test-task-success.webp",[12197,12798],{},[472,12800,11784],{"id":11784},[430,12802,12803],{},"Antigravity 2は、従来のIDEから誰でも使えるデスクトップアプリケーションへの大きな転換を示しており、一般のユーザーがどんなタスクでもオーケストレーター（指揮者）として機能できるように支援します。",[430,12805,12806],{},"ただし、Antigravity 2にはまだ改善の余地があります。機能が正常に動作しない場合、エラーハンドリングが曖昧なため、デバッグにストレスを感じることがあります。また、公式ドキュメントは推敲不足（おそらくAIが自動生成したもの）に感じられ、いくつかの参照先やファイルパスが現状間違っています。",[1650,12808,12809],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":425,"searchDepth":1067,"depth":1074,"links":12811},[12812,12813,12814,12817,12818,12819,12820],{"id":1765,"depth":1074,"text":1765},{"id":12201,"depth":1067,"text":12202},{"id":12247,"depth":1067,"text":12248,"children":12815},[12816],{"id":12269,"depth":1081,"text":12270},{"id":12343,"depth":1067,"text":12344},{"id":12704,"depth":1067,"text":12705},{"id":12777,"depth":1067,"text":12778},{"id":11784,"depth":1067,"text":11784},[1670],"2026-06-05","Google Antigravity 2の新機能をご紹介。アプリのインストール、AIエージェントの動作テスト、カスタムMCPサーバーの手動追加手順まで、実機でわかりやすく解説します。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FSetup%20Antigravity%202.0\u002FJA-Setup-Antigravity-2.0.webp","Google Antigravity 2 実機レビュー：AIエージェント・MCPサーバー・拡張機能の設定方法",{"schemaOrg":12827,"robots":1704,"sitemap":12829},[12828],{"@type":1681,"headline":12825,"description":12823},{"lastmod":12822},{"title":12825,"description":12823,"ogTitle":11837,"ogDescription":12823,"twitterTitle":11837,"twitterDescription":12823},"ja\u002Farticle\u002Fsetup-antigravity-2",[],"Y-9JnbicM9q_ERAV-rezJFwbGVtzr80egihubVpnW1E",{"id":12835,"title":8544,"author":1713,"body":12836,"category":13243,"date":13244,"description":13245,"extension":1675,"image":13246,"imageAlt":13247,"isPublished":1070,"meta":13248,"minRead":2288,"navigation":1070,"path":185,"seo":13254,"stem":13255,"tags":13256,"updatedAt":1713,"__hash__":13257},"article\u002Fja\u002Farticle\u002Fcentralised-the-skills-for-agents.md",{"type":427,"value":12837,"toc":13233},[12838,12845,12848,12871,12891,12894,12904,12915,12925,12931,12934,12956,12962,12973,12988,12998,13008,13011,13018,13039,13042,13048,13058,13065,13068,13088,13097,13100,13106,13178,13185,13189,13225,13230],[430,12839,12840,12841,12844],{},"パソコン上でHermes、Claude Code、Codex、Antigravity、Kimiなど、複数のAIエージェントやCLIツールを動かしているなら、ある非常にイライラする問題に直面したことがあるでしょう。それは**スキルの断片化（フラグメンテーション）**です。各エージェントやCLIがそれぞれ独自の",[491,12842,12843],{},"skills","フォルダを個別に保持しているため、同じスキルの重複インストール、バージョンの不一致、そして管理上のオーバーヘッドが発生してしまいます。",[430,12846,12847],{},"私たちはAIエージェントを活用する中で、頻繁に以下のような課題に直面していました。",[481,12849,12850,12856,12862],{},[484,12851,12852,12855],{},[448,12853,12854],{},"重複インストール",": あるエージェント用に新しいスキルをインストールした際、別のエージェントでも全く同じスキルを何度も再インストールしなければならない。",[484,12857,12858,12861],{},[448,12859,12860],{},"バージョンの不一致（Version Drift）",": 1つのエージェント用にスキルをカスタマイズしたり修正したりしたのに、他のエージェントでの更新を忘れてしまい、結果としてエージェントごとに挙動が異なってしまう。",[484,12863,12864,12867,12868,12870],{},[448,12865,12866],{},"非効率なスキル管理",": システム全体に散らばる各エージェントの",[491,12869,12843],{},"フォルダを1つずつ確認しないと、どのスキルが実際にインストールされているか把握できない。",[430,12872,12873,12874,12876,12877,12883,12884,12890],{},"Vercelがオープンソースで提供している",[491,12875,12722],{}," CLIは、1つの",[448,12878,12879,12880,12882],{},"一元管理された（セントライズされた）",[491,12881,12843],{},"フォルダ","を作成し、それをすべてのエージェントで共有することで、この課題を見事に解決します。詳細は",[441,12885,12887,12889],{"href":8489,"rel":12886},[445],[491,12888,12722],{},"のGitHubリポジトリ","をご確認ください。",[472,12892,12893],{"id":12893},"スキルの一元管理化",[430,12895,12896,12897,12899,12900,12903],{},"コンセプトは非常にシンプルです。すべての子エージェントの",[491,12898,12843],{},"フォルダを",[448,12901,12902],{},"同じ物理フォルダ","に紐づければ、断片化の問題は完全に解消されます。",[430,12905,12906,12908,12909,12911,12912,12914],{},[491,12907,12722],{}," CLIを使ってスキルをインストールすると、そのスキルはパソコン上の共有一元化フォルダ（",[491,12910,8529],{},"）にダウンロードされます。その後、CLIが各エージェントの",[491,12913,12843],{},"フォルダから、その一元化フォルダに向けた**シンボリックリンク（Symlink、ファイル実体への参照）**を自動で作成します。",[430,12916,12917,12918,12921,12922,12924],{},"例えば、Claude Codeが",[491,12919,12920],{},"~\u002F.claude\u002Fskills\u002F","内でスキルを探す際、自動的かつ透過的に",[491,12923,8529],{},"へとリダイレクトされます。一元化フォルダ内のスキルに少し手を加えるだけで、すべてのエージェントにその変更が即座に反映されます。手動コピーや同期スクリプトは不要で、ディスク容量も一切無駄になりません。",[472,12926,12928,12930],{"id":12927},"npx-skillsのインストールとスキルの追加",[491,12929,12722],{},"のインストールとスキルの追加",[430,12932,12933],{},"以下のコマンドを実行して開始し、最初のスキルを追加してみましょう。",[930,12935,12937],{"className":1038,"code":12936,"language":1040,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill --skill excalidraw-diagram\n",[491,12938,12939],{"__ignoreMap":425},[938,12940,12941,12943,12945,12947,12950,12953],{"class":940,"line":941},[938,12942,7493],{"class":1047},[938,12944,8504],{"class":1051},[938,12946,1061],{"class":1051},[938,12948,12949],{"class":1051}," https:\u002F\u002Fgithub.com\u002Fcoleam00\u002Fexcalidraw-diagram-skill",[938,12951,12952],{"class":1051}," --skill",[938,12954,12955],{"class":1051}," excalidraw-diagram\n",[430,12957,12958],{},[433,12959],{"alt":12960,"src":12961},"npx skills add コマンドを使用して GitHub からスキルをインストールする","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-add-command.webp",[430,12963,12964,12965,12968,12969],{},"CLIは、この設定を特定のプロジェクト用にするか、それともグローバルにするかを尋ねてきます。サポートされているすべての子エージェントからアクセスできるように、通常は",[448,12966,12967],{},"global","を選択することをお勧めします。\n",[433,12970],{"alt":12971,"src":12972},"npx skills CLI でグローバルインストールオプションを選択する","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-install-global-prompt.webp",[430,12974,12975,12976,12979,12980,12984],{},"次に、**唯一の真実のソース（Single Source of Truth）**を確保するために、必ず",[491,12977,12978],{},"Symlink","を選択してください。\n",[433,12981],{"alt":12982,"src":12983},"スキルの同期にシンボリックリンク（Symlink）方式を選択する","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-symlink-option.webp",[433,12985],{"alt":12986,"src":12987},"CLI でのスキルインストールおよびシンボリックリンク作成の完了確認","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-installation-completed.webp",[430,12989,12990,12991,12993,12994],{},"設定が完了したら、スキルが一元化フォルダ（",[491,12992,8529],{},"）に正しくインストールされているかを確認できます。\n",[433,12995],{"alt":12996,"src":12997},"中央ディレクトリにインストールされたスキルを確認・検証する","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills-directory-verification.webp",[430,12999,13000,13001,13003,13004],{},"Kimi CLI（またはお好みのエージェント）を起動すれば、",[491,13002,10158],{},"スキルがすぐに利用可能になっています！\n",[433,13005],{"alt":13006,"src":13007},"Kimi CLI が中央スキルのロードを完了し、使用可能な状態を示す画面","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skills-integration.webp",[472,13009,13010],{"id":13010},"スキルをゼロから自作する",[430,13012,13013,13014,13017],{},"独自のカスタムスキルを作成したい場合は、Anthropicの",[491,13015,13016],{},"skill-creator","ツールを利用できます。以下のようにインストールします。",[930,13019,13021],{"className":1038,"code":13020,"language":1040,"meta":425,"style":425},"npx skills add https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills --skill skill-creator\n",[491,13022,13023],{"__ignoreMap":425},[938,13024,13025,13027,13029,13031,13034,13036],{"class":940,"line":941},[938,13026,7493],{"class":1047},[938,13028,8504],{"class":1051},[938,13030,1061],{"class":1051},[938,13032,13033],{"class":1051}," https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills",[938,13035,12952],{"class":1051},[938,13037,13038],{"class":1051}," skill-creator\n",[430,13040,13041],{},"インストール後、Kimiやその他のエージェントに以下のプロンプトを入力します。",[930,13043,13046],{"className":13044,"code":13045,"language":4636},[4634],"Use the skill-creator to help me build a skill for creating a product landing page\n",[491,13047,13045],{"__ignoreMap":425},[430,13049,13050,13051,13053,13054],{},"エージェントが自動的に",[491,13052,13016],{},"を認識し、ステップバイステップでスキルの作成手順を案内してくれます。\n",[433,13055],{"alt":13056,"src":13057},"Kimi CLI で実行されるインタラクティブな skill-creator ウィザード","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fkimi-cli-skill-creator-setup.webp",[472,13059,13061,13062,13064],{"id":13060},"その他便利な-npx-skills-コマンド","その他便利な ",[491,13063,12722],{}," コマンド",[430,13066,13067],{},"知っておくと便利なその他のコマンドは以下の通りです。",[481,13069,13070,13076,13082],{},[484,13071,13072,13075],{},[491,13073,13074],{},"npx skills ls -g",": グローバルにインストールされているすべてのスキル一覧を表示",[484,13077,13078,13081],{},[491,13079,13080],{},"npx skills update",": 1つのコマンドですべてのスキルを最新状態に一括アップデート",[484,13083,13084,13087],{},[491,13085,13086],{},"npx skills remove",": インタラクティブにスキルをアンインストール\u002F削除",[430,13089,13090,13091,5722],{},"その他のコマンドや仕様については、",[441,13092,13094,13096],{"href":8489,"rel":13093},[445],[491,13095,12722],{}," のGitHubリポジトリ",[472,13098,13099],{"id":13099},"さらに一歩進んだ活用法",[430,13101,13102,13103,13105],{},"すべてのスキルが1つの場所（",[491,13104,8529],{},"）に集約されたため、このフォルダ自体をGitリポジトリとして初期化し、GitHubやGitLabにプッシュして管理できます。",[930,13107,13109],{"className":1038,"code":13108,"language":1040,"meta":425,"style":425},"cd ~\u002F.agents\u002Fskills\ngit init\ngit add .\ngit commit -m \"Initial skills folder\"\ngit remote add origin https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\ngit push -u origin main\n",[491,13110,13111,13118,13125,13133,13149,13164],{"__ignoreMap":425},[938,13112,13113,13115],{"class":940,"line":941},[938,13114,2818],{"class":970},[938,13116,13117],{"class":1051}," ~\u002F.agents\u002Fskills\n",[938,13119,13120,13122],{"class":940,"line":1067},[938,13121,2794],{"class":1047},[938,13123,13124],{"class":1051}," init\n",[938,13126,13127,13129,13131],{"class":940,"line":1074},[938,13128,2794],{"class":1047},[938,13130,1061],{"class":1051},[938,13132,4890],{"class":1051},[938,13134,13135,13137,13139,13142,13144,13147],{"class":940,"line":1081},[938,13136,2794],{"class":1047},[938,13138,12101],{"class":1051},[938,13140,13141],{"class":1051}," -m",[938,13143,3285],{"class":952},[938,13145,13146],{"class":1051},"Initial skills folder",[938,13148,1965],{"class":952},[938,13150,13151,13153,13156,13158,13161],{"class":940,"line":1933},[938,13152,2794],{"class":1047},[938,13154,13155],{"class":1051}," remote",[938,13157,1061],{"class":1051},[938,13159,13160],{"class":1051}," origin",[938,13162,13163],{"class":1051}," https:\u002F\u002Fgithub.com\u002FTech-Voyage-Dev\u002Fskills\n",[938,13165,13166,13168,13170,13173,13175],{"class":940,"line":1938},[938,13167,2794],{"class":1047},[938,13169,12072],{"class":1051},[938,13171,13172],{"class":1051}," -u",[938,13174,13160],{"class":1051},[938,13176,13177],{"class":1051}," main\n",[430,13179,13180,13181,13184],{},"これにより、スキルの全変更履歴を管理できるようになり、万が一アップデートで不具合が生じても簡単に元の状態にロールバックできます。また、ノートPCとデスクトップPCなど、複数のパソコン間で",[491,13182,13183],{},"git pull","を実行するだけで、スキルの状態をシームレスに同期することも可能です。",[472,13186,13188],{"id":13187},"注意すべき点セキュリティとリスク","注意すべき点（セキュリティとリスク）",[481,13190,13191,13197,13203,13213,13219],{},[484,13192,13193,13196],{},[448,13194,13195],{},"互換性の違い",": エージェントのプラットフォームによっては、カスタムフックや特定の許可ツールなど、一部の機能にまだ対応していない場合があります。あるエージェントでは正常に動くスキルでも、別のものでは制限がかかることがあります。",[484,13198,13199,13202],{},[448,13200,13201],{},"ソースの信頼性",": 信頼できるソースからのスキルのみをインストールするようにしてください。",[484,13204,13205,13208,13209,13212],{},[448,13206,13207],{},"実行前のコードレビュー",": カスタムスキルやサードパーティ製スキルを使用する場合は、エージェントに実行させる前に、ファイル（特に",[491,13210,13211],{},"scripts\u002F","フォルダ内）の中身を必ず目視で確認してください。",[484,13214,13215,13218],{},[448,13216,13217],{},"最小特権の原則",": スキルに対して、動作に必要以上の過剰なツール権限やアクセス権を与えないようにしましょう。",[484,13220,13221,13224],{},[448,13222,13223],{},"シークレット of ハードコード厳禁",": APIキーやパスワードなどの機密情報は、絶対にスキルファイル内に直接書き込まないでください。",[430,13226,13227,13229],{},[491,13228,12722],{},"を使って「唯一の真実のソース」を構築することで、私たちの開発チームは二度手間やバージョン同期のストレスから完全に解放されました。非常にお勧めの設定ですので、ぜひ試してみてください。スキルの成長に伴い、AIエージェントの可能性も大きく広がります！",[1650,13231,13232],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":425,"searchDepth":1067,"depth":1074,"links":13234},[13235,13236,13238,13239,13241,13242],{"id":12893,"depth":1067,"text":12893},{"id":12927,"depth":1067,"text":13237},"npx skillsのインストールとスキルの追加",{"id":13010,"depth":1067,"text":13010},{"id":13060,"depth":1067,"text":13240},"その他便利な npx skills コマンド",{"id":13099,"depth":1067,"text":13099},{"id":13187,"depth":1067,"text":13188},[1670],"2026-06-04","Claude CodeやKimiなどの複数のAIエージェントを使用中ですか？ npx skills CLIを利用して、重複を解消し1つのフォルダでスキルを一元管理する方法を解説。","https:\u002F\u002Finimages.techvoyage.dev\u002Farticles\u002FCentralised%20the%20skills%20for%20agents\u002Fnpx-skills%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6AI%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E3%82%B9%E3%82%AD%E3%83%AB%E3%83%95%E3%83%A9%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%EF%BC%88%E6%A9%9F%E8%83%BD%E3%81%AE%E6%96%AD%E7%89%87%E5%8C%96%EF%BC%89%E3%82%92%E8%A7%A3%E6%B6%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.webp","npx skills CLIを使って複数AIエージェント of スキル管理を一元化する",{"schemaOrg":13249,"robots":1704,"sitemap":13252},[13250],{"@type":1681,"headline":13251,"description":13245},"npx skillsでAIエージェントのスキルフラグメンテーションを解消する",{"lastmod":13253},"2026-06-03",{"title":13251,"description":13245,"ogTitle":8544,"ogDescription":13245,"twitterTitle":8544,"twitterDescription":13245},"ja\u002Farticle\u002Fcentralised-the-skills-for-agents",[],"V6r3vPU4pgaYTMMM5Kvtj6e8W9FDr6V_N6gcXVhYV5k",1792489976324]