{"id":22726,"date":"2025-11-07T22:17:32","date_gmt":"2025-11-07T22:17:32","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=22726"},"modified":"2025-11-07T22:17:32","modified_gmt":"2025-11-07T22:17:32","slug":"apps-sdk%e3%81%a7%e3%82%b7%e3%83%b3%e3%83%97%e3%83%ab%e3%81%aachatgpt%e3%82%a2%e3%83%97%e3%83%aa%e3%82%92%e4%bd%9c%e3%82%8b","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/22726\/","title":{"rendered":"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b"},"content":{"rendered":"\n<\/p>\n<div>\n<p data-line=\"0\" class=\"code-line\">Apps SDK\u3092\u4f7f\u3046\u3068ChatGPT\u3067\u52d5\u304f\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002<\/p>\n<p data-line=\"2\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/40389ce2bb5f-20251106.gif\" alt=\"ChatGPT\u306b\u5c0b\u306d\u308b\u3068\u30ab\u30d5\u30a7\u306e\u5e97\u8217\u4e00\u89a7\u304cUI\u3064\u304d\u3067\u8868\u793a\u3055\u308c\u3066\u3044\u308b\" class=\"md-img\" loading=\"lazy\"\/><\/p>\n<p data-line=\"4\" class=\"code-line\">\u4eca\u56de\u306f\u300cZ Coffee\u300d\u3068\u3044\u3046\u30ab\u30d5\u30a7\u3092\u60f3\u5b9a\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u3068\u306e\u3084\u308a\u53d6\u308a\u306b\u5fdc\u3058\u3066\u5e97\u8217\u60c5\u5831\u3092\u8868\u793a\u3059\u308b\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p data-line=\"6\" class=\"code-line\">\u3053\u308c\u3092\u3069\u306e\u3088\u3046\u306b\u5b9f\u88c5\u3057\u305f\u306e\u304b\u3092\u307e\u3068\u3081\u3066\u307f\u307e\u3059\u3002<\/p>\n<p data-line=\"10\" class=\"code-line\">OpenAI\u304c\u63d0\u4f9b\u3059\u308b\u4ed5\u7d44\u307f\u3067\u3001ChatGPT\u3068\u306e\u4f1a\u8a71\u306e\u4e2d\u30673rd party\u304c\u4f5c\u6210\u3057\u305f\u30a2\u30d7\u30ea\u3092\u30ea\u30c3\u30c1\u306aUI\u4ed8\u304d\u3067\u8868\u793a\u3067\u304d\u308b\u3082\u306e\u3067\u3059\u3002<br \/>\u4f8b\u3048\u3070\u300c\u6e0b\u8c37\u4ed8\u8fd1\u3067\u30db\u30c6\u30eb\u3092\u4e88\u7d04\u3057\u305f\u3044\u300d\u3068\u30e6\u30fc\u30b6\u30fc\u304c\u5c0b\u306d\u305f\u969b\u3001Booking.com\u306e\u30a2\u30d7\u30ea\u304c\u53cd\u5fdc\u3057\u3066\u6e0b\u8c37\u8fd1\u8fba\u306e\u30db\u30c6\u30eb\u306e\u4e00\u89a7\u3092\u753b\u50cf\u4ed8\u304d\u3067\u8868\u793a\u3059\u308b\u3001\u307f\u305f\u3044\u306a\u611f\u3058\u3067\u3059\u3002<\/p>\n<p data-line=\"13\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/zenn\/image\/fetch\/s--6InjcXs5--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_1200\/https:\/\/developers.openai.com\/images\/apps-sdk\/overview.png?_a=BACAGSGT\" alt=\"ChatGPT Apps\u306e\u30c7\u30b6\u30a4\u30f3\u4f8b\u3002\u30ab\u30eb\u30fc\u30bb\u30eb\u3084\u30d5\u30eb\u30b9\u30af\u30ea\u30fc\u30f3\u306a\u3069\u306e\u3044\u308d\u3093\u306a\u30d1\u30bf\u30fc\u30f3\u304c\u63cf\u304b\u308c\u3066\u3044\u308b\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>UI\u306f\u67d4\u8edf\u306b\u30c7\u30b6\u30a4\u30f3\u3067\u304d\u308b<\/em><\/p>\n<p data-line=\"16\" class=\"code-line\">UI\u306f\u304b\u306a\u308a\u81ea\u7531\u5ea6\u9ad8\u304f\u8868\u73fe\u3067\u304d\u307e\u3059\u3002\u30ea\u30b9\u30c8\u3084\u30ab\u30eb\u30fc\u30bb\u30eb\u306f\u3082\u3061\u308d\u3093\u3001\u30d5\u30eb\u30b9\u30af\u30ea\u30fc\u30f3\u3084PIP\uff08Picture in Picture\uff09\u3082\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<p data-line=\"18\" class=\"code-line\">\u3053\u3053\u3067\u306e\u8868\u73fe\u306fChatGPT\u306e\u4f53\u9a13\u3092\u5de6\u53f3\u3059\u308b\u305f\u3081\u3001<a target=\"_blank\" href=\"https:\/\/developers.openai.com\/apps-sdk\/concepts\/design-guidelines\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u30c7\u30b6\u30a4\u30f3\u30ac\u30a4\u30c9\u30e9\u30a4\u30f3<\/a>\u304c\u516c\u958b\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u8a73\u3057\u304f\u307e\u3068\u307e\u3063\u3066\u3044\u308b\u306e\u3067\u4e00\u8aad\u3057\u3066\u304a\u304d\u307e\u3057\u3087\u3046\u3002\u8aad\u307f\u7269\u3068\u3057\u3066\u3082\u9762\u767d\u3044\u3067\u3059\u3002<\/p>\n<p data-line=\"20\" class=\"code-line\"><strong>MCP\u3068\u4f55\u304c\u9055\u3046\u306e\uff1f<\/strong><\/p>\n<ul data-line=\"22\" class=\"code-line\">\n<li data-line=\"22\" class=\"code-line\">\u30ea\u30c3\u30c1\u306aUI\u8868\u73fe\u304c\u3067\u304d\u308b<\/li>\n<li data-line=\"23\" class=\"code-line\">\u30e6\u30fc\u30b6\u30fc\u304c\u4e8b\u524d\u306b\u8a2d\u5b9a\u3057\u306a\u304f\u3066\u3082\u4f7f\u3048\u308b\n<ul data-line=\"24\" class=\"code-line\">\n<li data-line=\"24\" class=\"code-line\">\u4f1a\u8a71\u306e\u5185\u5bb9\u306b\u5fdc\u3058\u3066ChatGPT\u304c\u5224\u65ad\u3057\u3001\u4f7f\u3063\u305f\u65b9\u304c\u826f\u3044\u3068\u601d\u3048\u308b\u30a2\u30d7\u30ea\u3092\u63a8\u85a6\u3059\u308b<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p data-line=\"26\" class=\"code-line\"><strong>\u3082\u3046\u4f7f\u3048\u308b\u306e\uff1f<\/strong><\/p>\n<ul data-line=\"28\" class=\"code-line\">\n<li data-line=\"28\" class=\"code-line\">\u307e\u3060\u30d7\u30ec\u30d3\u30e5\u30fc\u7248\uff082025\/11\/6\u6642\u70b9\uff09<\/li>\n<li data-line=\"29\" class=\"code-line\">2025\u5e74\u5f8c\u534a\u306b\u5be9\u67fb\u53d7\u4ed8\u958b\u59cb\u3001\u30a2\u30d7\u30ea\u53ce\u76ca\u5316\u306e\u65b9\u6cd5\u306b\u3064\u3044\u3066\u30a2\u30ca\u30a6\u30f3\u30b9\u304c\u3042\u308b\u3068\u767a\u8868\u3055\u308c\u3066\u3044\u308b<\/li>\n<li data-line=\"30\" class=\"code-line\">\u4eca\u6642\u70b9\u3067\u306fApps SDK\u3092\u4f7f\u3063\u305f\u958b\u767a + ChatGPT\u74b0\u5883\u3067\u8a66\u3059\u3068\u3053\u308d\u307e\u3067\u306f\u3067\u304d\u308b<\/li>\n<\/ul>\n<p data-line=\"32\" class=\"code-line\"><strong>\u305d\u306e\u4ed6<\/strong><\/p>\n<ul data-line=\"34\" class=\"code-line\">\n<li data-line=\"34\" class=\"code-line\">Apps SDK\u306fMCP\u3092\u30d9\u30fc\u30b9\u306b\u3057\u3066\u3044\u308b\n<ul data-line=\"35\" class=\"code-line\">\n<li data-line=\"35\" class=\"code-line\">MCP + UI\u3067\u30a4\u30e1\u30fc\u30b8\u3059\u308b\u3068\u5206\u304b\u308a\u3084\u3059\u3044\u304b\u3082<\/li>\n<li data-line=\"36\" class=\"code-line\">UI\u90e8\u5206\u306fReact\u306a\u3069\u306e\u6163\u308c\u305f\u6280\u8853\u3067\u4f5c\u308c\u308b<\/li>\n<\/ul>\n<\/li>\n<li data-line=\"37\" class=\"code-line\">ChatGPT\u3067\u8a66\u3059\u306b\u306f\u6709\u6599\u30d7\u30e9\u30f3\u304c\u5fc5\u8981\n<ul data-line=\"38\" class=\"code-line\">\n<li data-line=\"38\" class=\"code-line\">Buiness\u30d7\u30e9\u30f3\u306a\u3069\u306e\u30d3\u30b8\u30cd\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u3067\u306f\u4f7f\u3048\u305a\u3001\u500b\u4eba\u30d7\u30e9\u30f3\u304c\u5fc5\u8981<\/li>\n<li data-line=\"39\" class=\"code-line\">\u3053\u306e\u8fba\u308a\u306f\u72b6\u6cc1\u5909\u308f\u308a\u305d\u3046\u306a\u306e\u3067\u8981\u30a6\u30a9\u30c3\u30c1\u3002<a target=\"_blank\" href=\"https:\/\/github.com\/openai\/openai-apps-sdk-examples\/issues\/58#issuecomment-3422682581\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u3053\u306eIssue<\/a>\u306b\u8b70\u8ad6\u304c\u3088\u304f\u307e\u3068\u307e\u3063\u3066\u307e\u3059<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p data-line=\"43\" class=\"code-line\">\u3088\u308a\u5177\u4f53\u7684\u306b\u30a4\u30e1\u30fc\u30b8\u3059\u308b\u305f\u3081\u3001\u5b9f\u969b\u306bChatGPT Apps\u3092\u4f5c\u3063\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<br \/>\u4eca\u56de\u4f5c\u308b\u306e\u306f\u5192\u982d\u3067\u898b\u305f\u30ab\u30d5\u30a7\u306e\u5e97\u8217\u4e00\u89a7\u3092\u8fd4\u3059\u30a2\u30d7\u30ea\u3067\u3059\u3002<\/p>\n<h2 id=\"%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B\" data-line=\"46\" class=\"code-line\">\n \u30c7\u30fc\u30bf\u3092\u7528\u610f\u3059\u308b<\/h2>\n<p data-line=\"48\" class=\"code-line\">\u307e\u305a\u306f\u5e97\u8217\u306e\u30c7\u30fc\u30bf\u3092\u7528\u610f\u3057\u307e\u3059\u3002<br \/>API\u7d4c\u7531\u3067\u53d6\u5f97\u3067\u304d\u308b\u3068\u4fbf\u5229\u306a\u305f\u3081\u3001\u4eca\u56de\u306f\u30c7\u30fc\u30bf\u3092 <a target=\"_blank\" href=\"https:\/\/microcms.io\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">microCMS<\/a> \u3067\u7ba1\u7406\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<p data-line=\"51\" class=\"code-line\">\u4eca\u56de\u306f\u3053\u3093\u306a\u611f\u3058\u3067\u30c7\u30fc\u30bf\u3092\u5165\u308c\u307e\u3057\u305f\u3002<\/p>\n<p data-line=\"53\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/bb71afc20acf-20251106.png\" alt=\"microCMS\u306e\u7ba1\u7406\u753b\u9762\u3002\u5e97\u8217\u60c5\u5831\u304c\u5165\u7a3f\u3055\u308c\u3066\u3044\u308b\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>\u5e97\u8217\u60c5\u5831\u3092microCMS\u306b\u5165\u7a3f<\/em><\/p>\n<p data-line=\"56\" class=\"code-line\">API\u30ea\u30af\u30a8\u30b9\u30c8\u3067\u306f\u4f8b\u3048\u3070\u3053\u3093\u306a\u611f\u3058\u3067\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"58\">\/\/ curl \"https:\/\/z-coffee.microcms.io\/api\/v1\/stores\" -H \"X-MICROCMS-API-KEY: <api_key>\"\n\n{\n  \"contents\": [\n    {\n      \"id\": \"ps5gcbidm7-l\",\n      \"createdAt\": \"2025-10-28T08:51:17.841Z\",\n      \"name\": \"\u6075\u6bd4\u5bff\u5e97\",\n      \"address\": \"\u6771\u4eac\u90fd\u6e0b\u8c37\u533a\u6075\u6bd4\u5bff1-2-3\",\n      \"description\": \"\u7dd1\u306e\u591a\u3055\u304c\u7279\u5fb4\u306e\u5e97\u8217\u3067\u3059\u3002\u690d\u7269\u3068\u30b3\u30fc\u30d2\u30fc\u3092\u697d\u3057\u3093\u3067\u304f\u3060\u3055\u3044\u3002\",\n      \"review\": 4.3,\n      \"image\": {\n        \"url\": \"https:\/\/images.microcms-assets.io\/assets\/d7b6e3b4b6854706aaaa12421e654cd9\/bed3b9fd4ec44555b8901fb91ce6feb6\/image.png\",\n        \"height\": 1024,\n        \"width\": 1536\n      }\n    },\n    {\n      \"id\": \"hsotbprdnovj\",\n      \"createdAt\": \"2025-10-28T08:51:16.875Z\",\n      \"name\": \"\u4e2d\u76ee\u9ed2\u5e97\",\n      \/\/ ...(\u7701\u7565)\n<\/api_key><\/code><\/pre>\n<\/div>\n<p data-line=\"84\" class=\"code-line\">\u3053\u308c\u306f\u30b7\u30f3\u30d7\u30eb\u306a\u30ea\u30af\u30a8\u30b9\u30c8\u4f8b\u3067\u3059\u304c\u3001microCMS\u306b\u30c7\u30fc\u30bf\u3092\u5165\u308c\u3066\u304a\u3051\u3070\u4e26\u3073\u66ff\u3048\u3084\u7d5e\u308a\u8fbc\u307f\u306a\u3069\u3082\u7c21\u5358\u306b\u3067\u304d\u308b\u306e\u3067\u30aa\u30b9\u30b9\u30e1\u3067\u3059\u3002<\/p>\n<p data-line=\"86\" class=\"code-line\">\u6b21\u306f\u3053\u306eAPI\u3092\u30e9\u30c3\u30d7\u3059\u308b\u5f62\u3067MCP\u30b5\u30fc\u30d0\u30fc\u3092\u5b9f\u88c5\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<h2 id=\"mcp%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B\" data-line=\"88\" class=\"code-line\">\n MCP\u30b5\u30fc\u30d0\u30fc\u3092\u5b9f\u88c5\u3059\u308b<\/h2>\n<p data-line=\"90\" class=\"code-line\">MCP\u30b5\u30fc\u30d0\u30fc\u306fPython\u3042\u308b\u3044\u306fTypeScript\u306e\u516c\u5f0fSDK\u3067\u958b\u767a\u3059\u308b\u3053\u3068\u304c\u63a8\u5968\u3055\u308c\u3066\u3044\u307e\u3059\u3002<br \/>\u4eca\u56de\u306fTypeScript SDK\u3092\u9078\u3073\u307e\u3057\u305f\u3002<\/p>\n<p data-line=\"93\" class=\"code-line\">MCP\u30b5\u30fc\u30d0\u30fc\u306e\u30c4\u30fc\u30eb\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"95\">import { McpServer } from \"@modelcontextprotocol\/sdk\/server\/mcp.js\";\nimport { z } from \"zod\";\nimport { createClient } from \"microcms-js-sdk\";\nimport { StreamableHTTPTransport } from \"@hono\/mcp\";\nimport { Hono } from \"hono\";\nimport { serve } from \"@hono\/node-server\";\n\nconst server = new McpServer({\n    name: \"store-app\",\n    version: \"0.1.0\",\n});\n\nconst serviceDomain = process.env.MICROCMS_SERVICE_DOMAIN;\nconst apiKey = process.env.MICROCMS_API_KEY;\n\nlet microcmsClient: ReturnType<typeof createclient=\"\"> | null = null;\ntry {\n    microcmsClient = serviceDomain &amp;&amp; apiKey\n        ? createClient({ serviceDomain, apiKey })\n        : null;\n} catch {\n    microcmsClient = null;\n}\n\ntype OutStore = { id: string; name: string; address: string; review: number; image: string; description: string };\n\n\/\/ microCMS\u304b\u3089\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\nconst fetchStores = async (addressQuery?: string): Promise<outstore> =&gt; {\n    if (!microcmsClient) {\n        return [];\n    }\n    try {\n        const queries: any = { limit: 50, orders: \"-publishedAt\" };\n        if (addressQuery &amp;&amp; addressQuery.trim() !== \"\") {\n            queries.filters = `address[contains]${addressQuery}`;\n        }\n        const res = await microcmsClient.getList<any>({ endpoint: \"stores\", queries });\n        return (res.contents ?? []).map((c: any) =&gt; ({\n            id: String(c.id),\n            name: c.name ?? \"\",\n            address: c.address ?? \"\",\n            review: typeof c.review === \"number\" ? c.review : 0,\n            image: (c.image &amp;&amp; typeof c.image === \"object\" &amp;&amp; c.image.url) ? c.image.url : \"\",\n            description: c.description ?? \"\",\n        }));\n    } catch {\n        return [];\n    }\n};\n\n\/\/ \u5e97\u8217\u4e00\u89a7\u3092\u53d6\u5f97\u3059\u308b\u30c4\u30fc\u30eb\nserver.registerTool(\n    \"store-list\",\n    {\n        title: \"Show Store List\",\n        inputSchema: {\n            address: z.string().optional(),\n        },\n        outputSchema: {\n            stores: z.array(\n                z.object({\n                    id: z.string(),\n                    name: z.string(),\n                    address: z.string(),\n                    review: z.number(),\n                    image: z.string(),\n                    description: z.string(),\n                })\n            ),\n        },\n    },\n    async (params: { address?: string } | undefined) =&gt; {\n        const stores = await fetchStores(params?.address);\n        return {\n            content: [{ type: \"text\", text: JSON.stringify(stores) }],\n            structuredContent: { stores },\n        };\n    }\n);\n\nconst app = new Hono();\n\napp.get(\"https:\/\/zenn.dev\/\", (c) =&gt; {\n    return c.text(\"Hello, MCP Server is available at \/mcp, yah!\");\n});\n\napp.all(\"\/mcp\", async (c) =&gt; {\n    const transport = new StreamableHTTPTransport();\n    await server.connect(transport);\n    return transport.handleRequest(c);\n});\n\nserve(app);\n<\/any><\/outstore><\/typeof><\/code><\/pre>\n<\/div>\n<p data-line=\"191\" class=\"code-line\">\u5b9f\u88c5\u3067\u304d\u305f\u3089\u671f\u5f85\u901a\u308a\u52d5\u304f\u304b\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p data-line=\"193\" class=\"code-line\">\u307e\u305a\u306f\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3067\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"198\" class=\"code-line\">\u78ba\u8a8d\u306b\u306fMCP Inspector\u3092\u4f7f\u3044\u307e\u3059\u3002\u5225\u30bf\u30d6\u3092\u958b\u3044\u3066\u4ee5\u4e0b\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"199\">npx @modelcontextprotocol\/inspector\n<\/code><\/pre>\n<\/div>\n<p data-line=\"203\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/54b48f9fa233-20251104.png\" alt=\"MCP Inspector\u306e\u753b\u9762\u3002List Tools\u304c\u5b9f\u884c\u3055\u308c\u3001store-list\u306e\u60c5\u5831\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>MCP Inspector\u3067List Tools\u3092\u5b9f\u884c<\/em><\/p>\n<p data-line=\"206\" class=\"code-line\"><strong>Tools &gt; List Tools<\/strong> \u3092\u5b9f\u884c\u3057\u3001<code>store-list<\/code> \u30c4\u30fc\u30eb\u304c\u8868\u793a\u3055\u308c\u3066\u52d5\u3044\u3066\u3044\u308c\u3070\u78ba\u8a8d\u306fOK\u3067\u3059\u3002<\/p>\n<h2 id=\"ui%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B\" data-line=\"209\" class=\"code-line\">\n UI\u3092\u5b9f\u88c5\u3059\u308b<\/h2>\n<p data-line=\"211\" class=\"code-line\">\u6b21\u306bUI\u90e8\u5206\u3092\u5b9f\u88c5\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<h3 id=\"%E5%89%8D%E6%BA%96%E5%82%99\" data-line=\"213\" class=\"code-line\">\n \u524d\u6e96\u5099<\/h3>\n<p data-line=\"215\" class=\"code-line\">\u5fc5\u8981\u306a\u30d5\u30a1\u30a4\u30eb\u3092\u6e96\u5099\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p data-line=\"217\" class=\"code-line\">\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u306f\u3053\u3093\u306a\u611f\u3058\u3067\u3059\u3002<br \/><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/95ead8e15481-20251104.png\" alt=\"\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u3002MCP\u7cfb\u304cserver\/\u306b\u3001UI\u7cfb\u304cweb\/\u306b\u307e\u3068\u3081\u3089\u308c\u3066\u3044\u308b\" width=\"320\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u69cb\u6210\u3002server\/\u306bMCP\u30b5\u30fc\u30d0\u30fc\u7cfb\u3001web\/\u306bUI\u7cfb\u306e\u5b9f\u88c5\u304c\u3042\u308b<\/em><\/p>\n<p data-line=\"222\" class=\"code-line\"><code>index.css<\/code> \u3092\u4ee5\u4e0b\u306e\u5185\u5bb9\u3067\u4f5c\u6210\u3002<\/p>\n<p data-line=\"227\" class=\"code-line\"><code>types.ts<\/code> \u3092\u4ee5\u4e0b\u306e\u5185\u5bb9\u3067\u4f5c\u6210\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"228\">export type OpenAiGlobals = {\n    \/\/ visuals\n    theme: Theme;\n\n    userAgent: UserAgent;\n    locale: string;\n\n    \/\/ layout\n    maxHeight: number;\n    displayMode: DisplayMode;\n    safeArea: SafeArea;\n\n    \/\/ state\n    toolInput: ToolInput;\n    toolOutput: ToolOutput | null;\n    toolResponseMetadata: ToolResponseMetadata | null;\n    widgetState: WidgetState | null;\n    setWidgetState: (state: WidgetState) =&gt; Promise<void>;\n};\n\n\/\/ currently copied from types.ts in chatgpt\/web-sandbox.\n\/\/ Will eventually use a public package.\ntype API = {\n    callTool: CallTool;\n    sendFollowUpMessage: (args: { prompt: string }) =&gt; Promise<void>;\n    openExternal(payload: { href: string }): void;\n\n    \/\/ Layout controls\n    requestDisplayMode: RequestDisplayMode;\n};\n\nexport type UnknownObject = Record<string unknown=\"\">;\n\nexport type Theme = \"light\" | \"dark\";\n\nexport type SafeAreaInsets = {\n    top: number;\n    bottom: number;\n    left: number;\n    right: number;\n};\n\nexport type SafeArea = {\n    insets: SafeAreaInsets;\n};\n\nexport type DeviceType = \"mobile\" | \"tablet\" | \"desktop\" | \"unknown\";\n\nexport type UserAgent = {\n    device: { type: DeviceType };\n    capabilities: {\n        hover: boolean;\n        touch: boolean;\n    };\n};\n\n\/** Display mode *\/\nexport type DisplayMode = \"pip\" | \"inline\" | \"fullscreen\";\nexport type RequestDisplayMode = (args: { mode: DisplayMode }) =&gt; Promise;\n\nexport type CallToolResponse = {\n    result: string;\n};\n\n\/** Calling APIs *\/\nexport type CallTool = (\n    name: string,\n    args: Record<string unknown=\"\">\n) =&gt; Promise<calltoolresponse>;\n\n\/** Extra events *\/\nexport const SET_GLOBALS_EVENT_TYPE = \"openai:set_globals\";\nexport class SetGlobalsEvent extends CustomEvent;\n}&gt; {\n    readonly type = SET_GLOBALS_EVENT_TYPE;\n}\n\n\/**\n * Global oai object injected by the web sandbox for communicating with chatgpt host page.\n *\/\ndeclare global {\n    interface Window {\n        openai: API &amp; OpenAiGlobals;\n    }\n\n    interface WindowEventMap {\n        [SET_GLOBALS_EVENT_TYPE]: SetGlobalsEvent;\n    }\n}\n\nexport type Store = {\n    id: string;\n    name: string;\n    address: string;\n    review: number;\n    image: string;\n    description: string;\n};\n<\/calltoolresponse><\/string><\/string><\/void><\/void><\/code><\/pre>\n<\/div>\n<p data-line=\"341\" class=\"code-line\"><code>useOpenAi.ts<\/code> \u3092\u4ee5\u4e0b\u306e\u5185\u5bb9\u3067\u4f5c\u6210\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"342\">import { useSyncExternalStore } from \"react\";\nimport {\n    SET_GLOBALS_EVENT_TYPE,\n    SetGlobalsEvent,\n    type OpenAiGlobals,\n} from \".\/types\";\n\nexport function useOpenAiGlobal<k extends=\"\" keyof=\"\" openaiglobals=\"\">(\n    key: K\n): OpenAiGlobals[K] | null {\n    return useSyncExternalStore(\n        (onChange) =&gt; {\n            if (typeof window === \"undefined\") {\n                return () =&gt; { };\n            }\n\n            const handleSetGlobal = (event: SetGlobalsEvent) =&gt; {\n                const value = event.detail.globals[key];\n                if (value === undefined) {\n                    return;\n                }\n\n                onChange();\n            };\n\n            window.addEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal, {\n                passive: true,\n            });\n\n            return () =&gt; {\n                window.removeEventListener(SET_GLOBALS_EVENT_TYPE, handleSetGlobal);\n            };\n        },\n        () =&gt; window.openai?.[key] ?? null,\n        () =&gt; window.openai?.[key] ?? null\n    );\n}\n<\/k><\/code><\/pre>\n<\/div>\n<p data-line=\"382\" class=\"code-line\"><code>tsconfig.json<\/code> \u3092\u4ee5\u4e0b\u306e\u5185\u5bb9\u3067\u4f5c\u6210\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"384\">{\n    \"compilerOptions\": {\n        \"target\": \"ESNext\",\n        \"useDefineForClassFields\": true,\n        \"lib\": [\n            \"DOM\",\n            \"DOM.Iterable\",\n            \"ESNext\"\n        ],\n        \"allowJs\": false,\n        \"skipLibCheck\": true,\n        \"esModuleInterop\": false,\n        \"allowSyntheticDefaultImports\": true,\n        \"strict\": true,\n        \"forceConsistentCasingInFileNames\": true,\n        \"module\": \"ESNext\",\n        \"moduleResolution\": \"Bundler\",\n        \"resolveJsonModule\": true,\n        \"isolatedModules\": true,\n        \"noEmit\": true,\n        \"jsx\": \"react-jsx\",\n        \"allowImportingTsExtensions\": true\n    },\n    \"include\": [\n        \"src\",\n        \"build.mjs\"\n    ]\n}\n<\/code><\/pre>\n<\/div>\n<h3 id=\"%E5%BA%97%E8%88%97%E6%83%85%E5%A0%B1%E3%81%AEui%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%99%E3%82%8B\" data-line=\"415\" class=\"code-line\">\n \u5e97\u8217\u60c5\u5831\u306eUI\u3092\u5b9f\u88c5\u3059\u308b<\/h3>\n<p data-line=\"417\" class=\"code-line\">\u6e96\u5099\u304c\u3067\u304d\u305f\u306e\u3067\u5b9f\u969b\u306eUI\u90e8\u5206\u3092\u5b9f\u88c5\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p data-line=\"419\" class=\"code-line\">UI\u306f\u3053\u3093\u306a\u611f\u3058\u306e\u3082\u306e\u3092\u7d44\u3093\u3067\u3044\u304d\u307e\u3059\u3002<br \/><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/24c8af32a180-20251106.png\" alt=\"\u5e97\u8217\u304c\u3072\u3068\u3064\u305a\u3064\u30ab\u30fc\u30c9\u306b\u306a\u3063\u3066\u304a\u308a\u3001\u6a2a\u4e26\u3073\u306b\u306a\u3063\u3066\u3044\u308b\" width=\"480\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>\u5e97\u8217\u3092\u8868\u793a\u3059\u308bUI\u306e\u30a4\u30e1\u30fc\u30b8<\/em><\/p>\n<p data-line=\"423\" class=\"code-line\">\u307e\u305a\u3001\u5e97\u8217\u30ab\u30fc\u30c9\u3092 <code>store-list\/StoreListItem.tsx<\/code> \u306b\u4f5c\u6210\u3057\u307e\u3059\uff1a<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"424\">import React from \"react\";\nimport { Store } from \"..\/types\";\n\ntype StoreListItemProps = {\n    store: Store;\n    className?: string;\n};\n\nexport const StoreListItem: React.FC<storelistitemprops> = ({ store, className }) =&gt; {\n    return (\n        <li classname=\"{`bg-white\" rounded-2xl=\"\" shadow-sm=\"\" p-4=\"\" flex-shrink-0=\"\" w-=\"\" sm:w-=\"\">\n            <div>\n                <img decoding=\"async\" src=\"{store.image}\" alt=\"{store.name}\" classname=\"w-full h-56 object-cover rounded-2xl\"\/>\n            <\/div>\n            <div classname=\"mt-4\">\n                <h3 classname=\"text-xl font-semibold text-gray-900\">\n                    {store.name}\n                <\/h3>\n                <div classname=\"mt-2 flex items-center text-sm text-gray-600\">\n                    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewbox=\"0 0 20 20\" fill=\"currentColor\" classname=\"w-4 h-4 text-amber-500\" aria-hidden=\"true\">\n                        <path d=\"M9.049 2.927c.3-.921 1.603-.921 1.902 0l1.07 3.292a1 1 0 00.95.69h3.462c.969 0 1.371 1.24.588 1.81l-2.802 2.036a1 1 0 00-.364 1.118l1.07 3.292c.3.921-.755 1.688-1.538 1.118l-2.802-2.036a1 1 0 00-1.175 0l-2.802 2.036c-.783.57-1.838-.197-1.538-1.118l1.07-3.292a1 1 0 00-.364-1.118L2.88 8.72c-.783-.57-.38-1.81.588-1.81H6.93a1 1 0 00.95-.69l1.07-3.292z\"\/>\n                    <\/svg>\n                    <span classname=\"ml-1 font-medium\">{store.review.toFixed(1)}<\/span>\n                    {store.address &amp;&amp; <span classname=\"mx-2\">\u00b7<\/span>}\n                    <span classname=\"truncate\">{store.address}<\/span>\n                <\/div>\n                <p classname=\"mt-3 text-gray-700 line-clamp-3 text-sm\">\n                    {store.description}\n                <\/p>\n                \n            <\/div>\n        <\/li>\n    );\n};\n<\/storelistitemprops><\/code><\/pre>\n<\/div>\n<p data-line=\"480\" class=\"code-line\">\u6b21\u306b\u5e97\u8217\u4e00\u89a7\u3092 <code>store-list\/StoreList.tsx<\/code> \u306b\u4f5c\u6210\u3057\u307e\u3059\uff1a<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"481\">import React from \"react\";\nimport { useOpenAiGlobal } from \"..\/useOpenAi\";\nimport { Store } from \"..\/types\";\nimport { StoreListItem } from \".\/StoreListItem.tsx\";\n\nexport const StoreList: React.FC = () =&gt; {\n    const toolOutput = useOpenAiGlobal(\"toolOutput\");\n    const initialStores = toolOutput\n        ? toolOutput.stores as Store[]\n        : [];\n\n    const [stores, setStores] = React.useState<store>(initialStores);\n\n    React.useEffect(() =&gt; {\n        if (toolOutput?.stores) {\n            setStores(toolOutput.stores);\n        }\n    }, [toolOutput]);\n\n    return (\n        <div classname=\"bg-blue-50 p-4 rounded\">\n            \n            <div classname=\"relative antialiased\">\n                <div classname=\"overflow-x-auto overflow-y-hidden\">\n                    <ul classname=\"flex gap-4 items-stretch pr-4 py-1\">\n                        {stores.map((store) =&gt; (\n                            <storelistitem key=\"{store.id}\" store=\"{store}\"\/>\n                        ))}\n                    <\/ul>\n                <\/div>\n            <\/div>\n        <\/div>\n    );\n};\n<\/store><\/code><\/pre>\n<\/div>\n<p data-line=\"518\" class=\"code-line\">\u6700\u5f8c\u306b <code>store-list\/index.ts<\/code> \u3092\u4f5c\u6210\u3057\u307e\u3059\uff1a<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"519\">import React from \"react\";\nimport { createRoot } from \"react-dom\/client\";\nimport { StoreList } from \".\/StoreList\";\nimport \"..\/index.css\";\n\nconst container = document.getElementById(\"store-list-root\");\nif (container) {\n    const root = createRoot(container);\n    root.render(<storelist\/>);\n}\n<\/code><\/pre>\n<\/div>\n<h3 id=\"%E3%83%93%E3%83%AB%E3%83%89%E8%A8%AD%E5%AE%9A%E3%82%92%E6%BA%96%E5%82%99\" data-line=\"532\" class=\"code-line\">\n \u30d3\u30eb\u30c9\u8a2d\u5b9a\u3092\u6e96\u5099<\/h3>\n<p data-line=\"534\" class=\"code-line\"><code>build.mjs<\/code> \u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"536\">import * as esbuild from \"esbuild\";\nimport tailwindPlugin from \"esbuild-plugin-tailwindcss\";\n\nasync function build() {\n    const commonOptions = {\n        bundle: true,\n        loader: { \".tsx\": \"tsx\", \".ts\": \"ts\", \".css\": \"css\" },\n        jsx: \"automatic\",\n        platform: \"browser\",\n        target: \"es2020\",\n        minify: true,\n        sourcemap: true,\n        external: [\"tailwindcss\"],\n        plugins: [tailwindPlugin()],\n    };\n\n    try {\n        \/\/ Build store-list\n        await esbuild.build({\n            ...commonOptions,\n            entryPoints: [\"src\/store-list\/index.tsx\"],\n            outfile: \"dist\/store-list.js\",\n        });\n        console.log(\"\u2713 store-list.js built successfully\");\n\n        console.log(\"\\nBuild completed successfully!\");\n    } catch (error) {\n        console.error(\"Build failed:\", error);\n        process.exit(1);\n    }\n}\n\nbuild();\n<\/code><\/pre>\n<\/div>\n<p data-line=\"572\" class=\"code-line\"><code>package.json<\/code> \u306b\u30d3\u30eb\u30c9\u30b3\u30de\u30f3\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"574\">{\n  ..\n  \"scripts\": {\n    \"build\": \"node build.mjs\"\n  }\n  ..\n<\/code><\/pre>\n<\/div>\n<h3 id=\"%E3%83%93%E3%83%AB%E3%83%89%E3%81%97%E3%81%A6%E7%94%9F%E6%88%90%E7%89%A9%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B\" data-line=\"583\" class=\"code-line\">\n \u30d3\u30eb\u30c9\u3057\u3066\u751f\u6210\u7269\u3092\u78ba\u8a8d\u3059\u308b<\/h3>\n<p data-line=\"585\" class=\"code-line\">\u3053\u3053\u307e\u3067\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u6e96\u5099\u3067\u304d\u305f\u3089\u30d3\u30eb\u30c9\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"587\">\/\/ web\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u5b9f\u884c\nnpm run build\n<\/code><\/pre>\n<\/div>\n<p data-line=\"592\" class=\"code-line\">\u3046\u307e\u304f\u3044\u3051\u3070\u4ee5\u4e0b\u306e\u30d1\u30b9\u306b\u30d5\u30a1\u30a4\u30eb\u304c\u751f\u6210\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u78ba\u8a8d\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<ul data-line=\"594\" class=\"code-line\">\n<li data-line=\"594\" class=\"code-line\"><code>web\/dist\/store-list.css<\/code><\/li>\n<li data-line=\"595\" class=\"code-line\"><code>web\/dist\/store-list.js<\/code><\/li>\n<\/ul>\n<h2 id=\"%E3%83%84%E3%83%BC%E3%83%AB%E3%81%A8ui%E3%82%92%E7%B9%8B%E3%81%90\" data-line=\"598\" class=\"code-line\">\n \u30c4\u30fc\u30eb\u3068UI\u3092\u7e4b\u3050<\/h2>\n<p data-line=\"600\" class=\"code-line\">\u6700\u521d\u306b\u3001\u5b9f\u88c5\u3057\u305fMCP\u30c4\u30fc\u30eb\u304b\u3089UI\u306b\u63a5\u7d9a\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"602\">const fetchStores = { ... };\n\n\/\/ \u3053\u3053\u304b\u3089\u8ffd\u8a18\nimport { readFileSync } from \"fs\";\n\nconst storeListJS = readFileSync(\"..\/web\/dist\/store-list.js\", \"utf-8\");\nconst storeListCSS = readFileSync(\"..\/web\/dist\/store-list.css\", \"utf-8\");\n\nconst storeListHTML = `\n\n\n<script><![CDATA[${storeListJS}]]><\/script>\n`;\n\nserver.registerResource(\n    \"store-list-widget\",\n    \"ui:\/\/widget\/store-list.html\",\n    {},\n    async () =&gt; ({\n        contents: [\n            {\n                uri: \"ui:\/\/widget\/store-list.html\",\n                mimeType: \"text\/html+skybridge\",\n                text: storeListHTML,\n                _meta: {\n                    \"openai\/widgetDescription\": \"Simple Store List\",\n                },\n            },\n        ],\n    })\n);\n\n\/\/ ...\u3053\u3053\u307e\u3067\u8ffd\u8a18\n\nserver.registerTool( ... )\n<\/code><\/pre>\n<\/div>\n<p data-line=\"640\" class=\"code-line\">\u30d5\u30a1\u30a4\u30eb\u3092\u5909\u66f4\u3067\u304d\u305f\u3089\u52d5\u4f5c\u78ba\u8a8d\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p data-line=\"642\" class=\"code-line\">\u30b5\u30fc\u30d0\u30fc\u3092\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"647\" class=\"code-line\">MCP Inspector\u3092\u5225\u30bf\u30d6\u3067\u7acb\u3061\u4e0a\u3052\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"648\">npx @modelcontextprotocol\/inspector\n<\/code><\/pre>\n<\/div>\n<p data-line=\"652\" class=\"code-line\"><strong>List Resources<\/strong> \u3067\u3001\u4eca\u5b9a\u7fa9\u3057\u305f\u30ea\u30bd\u30fc\u30b9\u304c\u8aad\u307f\u8fbc\u307e\u308c\u3066\u3044\u308c\u3070OK\u3067\u3059\u3002<\/p>\n<p data-line=\"654\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/a729e9f9f090-20251104.png\" alt=\"MCP Inspector\u306e\u753b\u9762\u3002List Resources\u304c\u5b9f\u884c\u3055\u308c\u3066\u3044\u308b\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>MCP Inspector\u3067List Resources\u3092\u5b9f\u884c<\/em><\/p>\n<h2 id=\"chatgpt%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B\" data-line=\"658\" class=\"code-line\">\n ChatGPT\u3067\u78ba\u8a8d\u3059\u308b<\/h2>\n<h3 id=\"ngrok%E3%81%A7url%E3%82%92%E5%8F%96%E5%BE%97\" data-line=\"660\" class=\"code-line\">\n ngrok\u3067URL\u3092\u53d6\u5f97<\/h3>\n<p data-line=\"662\" class=\"code-line\">\u305d\u308c\u3067\u306f\u5b9f\u969b\u306bChatGPT\u304b\u3089\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p data-line=\"664\" class=\"code-line\">ChatGPT\u304b\u3089\u958b\u767a\u4e2d\u30a2\u30d7\u30ea\u306b\u63a5\u7d9a\u3059\u308b\u969b\u3001\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u516c\u958b\u3055\u308c\u305fURL\u304c\u5fc5\u8981\u3067\u3059\u3002<br \/>\u30ed\u30fc\u30ab\u30eb\u74b0\u5883\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306b <code>ngrok<\/code> \u3092\u5229\u7528\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"667\" class=\"code-line\"><a target=\"_blank\" href=\"https:\/\/ngrok.com\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ngrok<\/a> \u3067\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u4f5c\u6210\u3057\u3001\u624b\u9806\u306b\u5f93\u3063\u3066\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"669\">brew install ngrok\nngrok config add-authtoken <your_auth_token>\n<\/your_auth_token><\/code><\/pre>\n<\/div>\n<p data-line=\"674\" class=\"code-line\">\u30dd\u30fc\u30c83000\u306b\u5411\u3051\u3066\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"679\" class=\"code-line\">\u4ee5\u4e0b\u306e\u3088\u3046\u306aURL\u304c\u5410\u304b\u308c\u308b\u306e\u3067\u3001\u3053\u3061\u3089\u3092\u30e1\u30e2\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"680\">https:\/\/xxxxxxxxxxxxxx.ngrok-free.dev\n<\/code><\/pre>\n<\/div>\n<h3 id=\"chatgpt%E3%81%AB%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B\" data-line=\"684\" class=\"code-line\">\n ChatGPT\u306b\u8a2d\u5b9a\u3059\u308b<\/h3>\n<p data-line=\"686\" class=\"code-line\">ChatGPT\u306e\u300c<a target=\"_blank\" href=\"https:\/\/chatgpt.com\/#settings\/Connectors\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u8a2d\u5b9a &gt; \u30a2\u30d7\u30ea\u3068\u30b3\u30cd\u30af\u30bf\u30fc<\/a>\u300d\u753b\u9762\u3092\u958b\u304d\u3001\u4e0b\u90e8\u306b\u30b9\u30af\u30ed\u30fc\u30eb\u3057\u3066 <strong>\u9ad8\u5ea6\u306a\u8a2d\u5b9a<\/strong> \u3092\u9078\u629e\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"688\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/d6bf18bb2d03-20251104.png\" alt=\"ChatGPT\u306e\u30a2\u30d7\u30ea\u3068\u30b3\u30cd\u30af\u30bf\u30fc\u8a2d\u5b9a\u753b\u9762\" width=\"480\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>\u9ad8\u5ea6\u306a\u8a2d\u5b9a\u30e1\u30cb\u30e5\u30fc\u3092\u958b\u304f<\/em><\/p>\n<p data-line=\"691\" class=\"code-line\">\u3053\u3053\u304b\u3089\u958b\u767a\u8005\u30e2\u30fc\u30c9\u3092ON\u306b\u3057\u307e\u3057\u3087\u3046\u3002<\/p>\n<p data-line=\"693\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/69b696280de9-20251104.png\" alt=\"ChatGPT\u306e\u958b\u767a\u8005\u30e2\u30fc\u30c9\u8a2d\u5b9a\u753b\u9762\" width=\"480\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>\u958b\u767a\u8005\u30e2\u30fc\u30c9\u3092ON\u306b\u3059\u308b<\/em><\/p>\n<p data-line=\"696\" class=\"code-line\">\u30a2\u30d7\u30ea\u3068\u30b3\u30cd\u30af\u30bf\u30fc\u753b\u9762\u306b\u623b\u308a\u3001\u53f3\u4e0a\u306b\u300c\u4f5c\u6210\u3059\u308b\u300d\u30dc\u30bf\u30f3\u304c\u8868\u793a\u3055\u308c\u308b\u306e\u3067\u9078\u629e\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"698\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/63376ba226a4-20251104.png\" alt=\"ChatGPT\u306e\u30a2\u30d7\u30ea\u3068\u30b3\u30cd\u30af\u30bf\u30fc\u753b\u9762\u3067\u3001\u53f3\u4e0a\u306b\u4f5c\u6210\u30dc\u30bf\u30f3\u304c\u3042\u308b\" width=\"480\" class=\"md-img\" loading=\"lazy\"\/><\/p>\n<p data-line=\"700\" class=\"code-line\">\u5404\u9805\u76ee\u3092\u5165\u529b\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"702\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/b0752aae2096-20251104.png\" alt=\"ChatGPT\u306e\u30a2\u30d7\u30ea\u4f5c\u6210\u753b\u9762\u3067\u3001\u5165\u529b\u30d5\u30a9\u30fc\u30e0\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\" width=\"480\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>MCP\u30b5\u30fc\u30d0\u30fcURL\u306b\u306f\u5148\u307b\u3069\u306engrok\u306e\u3082\u306e\u3092\u5165\u529b<\/em><\/p>\n<p data-line=\"705\" class=\"code-line\">\u540d\u524d\u3001\u8aac\u660e\u3001MCP\u30b5\u30fc\u30d0\u30fc\u306eURL\uff08\u5148\u307b\u3069\u30b3\u30d4\u30fc\u3057\u305f\u3082\u306e\uff09\u3092\u8a18\u8f09\u3057\u307e\u3059\u3002\u8a8d\u8a3c\u306f\u300c\u8a8d\u8a3c\u306a\u3057\u300d\u3092\u9078\u629e\u3057\u307e\u3059\u3002<br \/>\u30a2\u30a4\u30b3\u30f3\u306f\u306a\u3057\u3067\u3082\u826f\u3044\u3067\u3059\u304c\u3001ChatGPT\u306b\u4f5c\u3063\u3066\u3082\u3089\u3063\u305f\u3082\u306e\u3092\u8a2d\u5b9a\u3057\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<h3 id=\"chatgpt%E3%81%A7%E8%A9%A6%E3%81%99\" data-line=\"708\" class=\"code-line\">\n ChatGPT\u3067\u8a66\u3059<\/h3>\n<p data-line=\"710\" class=\"code-line\">\u305d\u308c\u3067\u306f\u5b9f\u969b\u306bChatGPT\u3067\u8a66\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p data-line=\"712\" class=\"code-line\">\u78ba\u5b9f\u306b\u767a\u706b\u3055\u305b\u308b\u305f\u3081\u306b\u3001\u3053\u3053\u3067\u306f\u307e\u305a\u30a2\u30d7\u30ea\u3092\u9078\u629e\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"714\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/a1ffcd3b0a82-20251104.png\" alt=\"ChatGPT\u306e\u30c1\u30e3\u30c3\u30c8\u753b\u9762\u3067\u30011.+\u30dc\u30bf\u30f3 2.\u3055\u3089\u306b\u8868\u793a 3.Z Coffee Store \u3068\u9078\u629e\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>ChatGPT\u306e+\u30dc\u30bf\u30f3\u304b\u3089\u30a2\u30d7\u30ea\u3092\u9078\u629e<\/em><\/p>\n<p data-line=\"717\" class=\"code-line\">ChatGPT\u306b\u5c0b\u306d\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"719\">\u300cZ Coffee Store \u306e\u5e97\u8217\u4e00\u89a7\u3092\u6559\u3048\u3066\u300d\n<\/code><\/pre>\n<\/div>\n<p data-line=\"723\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/2d949d4354dc-20251104.png\" alt=\"ChatGPT\u306e\u30c1\u30e3\u30c3\u30c8\u753b\u9762\u3067\u3001UI\u3064\u304d\u3067\u5e97\u8217\u4e00\u89a7\u306e\u60c5\u5831\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u308b\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>\u5e97\u8217\u4e00\u89a7\u304cUI\u3064\u304d\u3067\u8868\u793a\u3055\u308c\u308b<\/em><\/p>\n<p data-line=\"726\" class=\"code-line\">\u5e97\u8217\u60c5\u5831\u304c\u8868\u793a\u3055\u308c\u307e\u3057\u305f\uff01\u3044\u3044\u611f\u3058\u3067\u3059\u3002<\/p>\n<p data-line=\"728\" class=\"code-line\">\u3053\u3053\u307e\u3067\u306e\u5b9f\u88c5\u306b\u3001\u4f4f\u6240\u3067\u7d5e\u308a\u8fbc\u3093\u3067\u5e97\u8217\u3092\u53d6\u5f97\u3059\u308b\u30ed\u30b8\u30c3\u30af\u3082\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<br \/>\u300c\u516d\u672c\u6728\u300d\u306b\u3042\u308b\u5e97\u8217\u3092\u5c0b\u306d\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<p data-line=\"731\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/storage.googleapis.com\/zenn-user-upload\/3876e60ff6ae-20251104.png\" alt=\"ChatGPT\u306e\u30c1\u30e3\u30c3\u30c8\u753b\u9762\u3067\u3001\u516d\u672c\u6728\u306e\u5e97\u8217\u60c5\u5831\u304cUI\u3064\u304d\u3067\u8868\u793a\u3055\u308c\u3066\u3044\u308b\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>\u6307\u5b9a\u3057\u305f\u4f4f\u6240\u3067\u7d5e\u308a\u8fbc\u307e\u308c\u3066\u3044\u308b\u306e\u304c\u5206\u304b\u308b<\/em><\/p>\n<p data-line=\"734\" class=\"code-line\">\u7d5e\u308a\u8fbc\u3093\u3060\u7d50\u679c\u304c\u8868\u793a\u3055\u308c\u3066\u3044\u307e\u3059\u306d\u3002<\/p>\n<p data-line=\"736\" class=\"code-line\">\u3053\u308c\u3067\u30a2\u30d7\u30ea\u306e\u958b\u767a\u306f\u5b8c\u4e86\u3067\u3059\uff01<\/p>\n<p data-line=\"741\" class=\"code-line\">Apps SDK\u3092\u4f7f\u3063\u3066ChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\u624b\u9806\u3092\u7d39\u4ecb\u3057\u307e\u3057\u305f\u3002<\/p>\n<p data-line=\"743\" class=\"code-line\">\u4eca\u56de\u306f\u6700\u4f4e\u9650\u306eUI\u5b9f\u88c5\u3067\u3057\u305f\u304c\u3001<a target=\"_blank\" href=\"https:\/\/github.com\/openai\/openai-apps-sdk-examples\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u516c\u5f0f\u306e\u30b5\u30f3\u30d7\u30eb<\/a>\u306b\u306f\u30d5\u30eb\u30b9\u30af\u30ea\u30fc\u30f3\u8868\u793a\u306a\u3069\u305f\u304f\u3055\u3093\u306e\u4f8b\u304c\u3042\u308a\u53c2\u8003\u306b\u306a\u308a\u307e\u3059\uff08\u305d\u306e\u307e\u307e\u3060\u3068\u52d5\u304b\u306a\u3044\u30b1\u30fc\u30b9\u3082\u3042\u308b\u306e\u3067Issue\u3092\u90fd\u5ea6\u78ba\u8a8d\u3059\u308b\u3068\u826f\u3044\u3067\u3059\uff09\u3002<\/p>\n<p data-line=\"745\" class=\"code-line\">\u4eca\u5e74\u5f8c\u534a\u306b\u306f\u5be9\u67fb\u306e\u53d7\u4ed8\u304c\u958b\u59cb\u3055\u308c\u308b\u3068\u30a2\u30ca\u30a6\u30f3\u30b9\u3055\u308c\u3066\u3044\u307e\u3059\u3002<br \/>\u72b6\u6cc1\u3092\u30a6\u30a9\u30c3\u30c1\u3057\u306a\u304c\u3089\u3001\u8272\u3005\u3067\u304d\u308b\u3053\u3068\u3092\u8a66\u3057\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<p data-line=\"748\" class=\"code-line\">\u3082\u3057\u5185\u5bb9\u306b\u8aa4\u308a\u304c\u3042\u308a\u307e\u3057\u305f\u3089\u3054\u6307\u6458\u304f\u3060\u3055\u3044\ud83d\ude47\u200d\u2642\ufe0f<\/p>\n<p data-line=\"755\" class=\"code-line\">AI\u958b\u767a\u306eTips\u306a\u3069\u3092\u30dd\u30b9\u30c8\u3057\u3066\u308b\u306e\u3067\u3001<a target=\"_blank\" href=\"https:\/\/x.com\/himara2\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">X\u3092\u30d5\u30a9\u30ed\u30fc<\/a>\u3057\u3066\u3082\u3089\u3048\u308b\u3068\u3046\u308c\u3057\u3044\u3067\u3059\uff01<\/p>\n<\/div>\n\n<br \/><a href=\"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"Apps SDK\u3092\u4f7f\u3046\u3068ChatGPT\u3067\u52d5\u304f\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 \u4eca\u56de\u306f\u300cZ Coffee\u300d\u3068\u3044\u3046\u30ab\u30d5\u30a7\u3092\u60f3\u5b9a\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u3068\u306e\u3084\u308a\u53d6\u308a\u306b\u5fdc\u3058\u3066\u5e97\u8217\u60c5\u5831\u3092\u8868\u793a\u3059\u308b\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u305f\u3002 \u3053\u308c\u3092\u3069\u306e\u3088\u3046\u306b\u5b9f\u88c5\u3057\u305f\u306e [&hellip;]","protected":false},"author":1,"featured_media":22727,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[2],"tags":[],"class_list":["post-22726","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hatena-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b - \u30dd\u30b1\u30b3\u30f3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"Apps SDK\u3092\u4f7f\u3046\u3068ChatGPT\u3067\u52d5\u304f\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 \u4eca\u56de\u306f\u300cZ Coffee\u300d\u3068\u3044\u3046\u30ab\u30d5\u30a7\u3092\u60f3\u5b9a\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u3068\u306e\u3084\u308a\u53d6\u308a\u306b\u5fdc\u3058\u3066\u5e97\u8217\u60c5\u5831\u3092\u8868\u793a\u3059\u308b\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u305f\u3002 \u3053\u308c\u3092\u3069\u306e\u3088\u3046\u306b\u5b9f\u88c5\u3057\u305f\u306e [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-07T22:17:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/1762553851_og-base-w1200-v2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"5\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zenn.dev\\\/himara2\\\/articles\\\/ae362b516e9e52#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/22726\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\",\"datePublished\":\"2025-11-07T22:17:32+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/22726\\\/\"},\"wordCount\":122,\"image\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/himara2\\\/articles\\\/ae362b516e9e52#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/1762553851_og-base-w1200-v2.png\",\"articleSection\":[\"\u306f\u3066\u306a\u30d6\u30ed\u30b0\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/22726\\\/\",\"url\":\"https:\\\/\\\/zenn.dev\\\/himara2\\\/articles\\\/ae362b516e9e52\",\"name\":\"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/himara2\\\/articles\\\/ae362b516e9e52#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/himara2\\\/articles\\\/ae362b516e9e52#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/1762553851_og-base-w1200-v2.png\",\"datePublished\":\"2025-11-07T22:17:32+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/himara2\\\/articles\\\/ae362b516e9e52#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zenn.dev\\\/himara2\\\/articles\\\/ae362b516e9e52\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/zenn.dev\\\/himara2\\\/articles\\\/ae362b516e9e52#primaryimage\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/1762553851_og-base-w1200-v2.png\",\"contentUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/1762553851_og-base-w1200-v2.png\",\"width\":1200,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zenn.dev\\\/himara2\\\/articles\\\/ae362b516e9e52#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b - \u30dd\u30b1\u30b3\u30f3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52","og_locale":"ja_JP","og_type":"article","og_title":"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b - \u30dd\u30b1\u30b3\u30f3","og_description":"Apps SDK\u3092\u4f7f\u3046\u3068ChatGPT\u3067\u52d5\u304f\u30a2\u30d7\u30ea\u3092\u4f5c\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 \u4eca\u56de\u306f\u300cZ Coffee\u300d\u3068\u3044\u3046\u30ab\u30d5\u30a7\u3092\u60f3\u5b9a\u3057\u3001\u30e6\u30fc\u30b6\u30fc\u3068\u306e\u3084\u308a\u53d6\u308a\u306b\u5fdc\u3058\u3066\u5e97\u8217\u60c5\u5831\u3092\u8868\u793a\u3059\u308b\u30a2\u30d7\u30ea\u3092\u4f5c\u3063\u3066\u307f\u307e\u3057\u305f\u3002 \u3053\u308c\u3092\u3069\u306e\u3088\u3046\u306b\u5b9f\u88c5\u3057\u305f\u306e [&hellip;]","og_url":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-11-07T22:17:32+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/1762553851_og-base-w1200-v2.png","type":"image\/png"}],"author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"5\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/22726\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b","datePublished":"2025-11-07T22:17:32+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/22726\/"},"wordCount":122,"image":{"@id":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/1762553851_og-base-w1200-v2.png","articleSection":["\u306f\u3066\u306a\u30d6\u30ed\u30b0"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/22726\/","url":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52","name":"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"primaryImageOfPage":{"@id":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52#primaryimage"},"image":{"@id":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/1762553851_og-base-w1200-v2.png","datePublished":"2025-11-07T22:17:32+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52#primaryimage","url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/1762553851_og-base-w1200-v2.png","contentUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/11\/1762553851_og-base-w1200-v2.png","width":1200,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/zenn.dev\/himara2\/articles\/ae362b516e9e52#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"Apps SDK\u3067\u30b7\u30f3\u30d7\u30eb\u306aChatGPT\u30a2\u30d7\u30ea\u3092\u4f5c\u308b"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/22726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=22726"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/22726\/revisions"}],"predecessor-version":[{"id":22728,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/22726\/revisions\/22728"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media\/22727"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=22726"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=22726"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=22726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}