{"title":"カスタム MCP クライアントを構築","slug":"custom-client","category":"mcp","summary":"MCP SDK を使用して独自のアプリケーションから Synapse MCP サーバーに接続。","audience":["human","llm"],"tags":["mcp","custom","sdk","development"],"difficulty":"advanced","updated":"2026-06-27","word_count":94,"read_minutes":1,"lang":"ja","translated":true,"requested_lang":"ja","content_markdown":"\n# カスタム MCP クライアントを構築\n\n独自の LLM アプリケーションを構築している場合、公式 MCP SDK を使用して Synapse MCP サーバーに直接接続できます。これにより、アプリは 79 個すべての Synapse ツールにアクセスできます。\n\n## SDK\n\n| 言語 | パッケージ |\n|----------|---------|\n| TypeScript/JavaScript | `@modelcontextprotocol/sdk` |\n| Python | `mcp` |\n\n## TypeScript の例\n\n### インストール\n\n```bash\nnpm install @modelcontextprotocol/sdk\n```\n\n### stdio で接続\n\n```typescript\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\n\nconst transport = new StdioClientTransport({\n  command: \"npx\",\n  args: [\"-y\", \"synapse-mcp-api@latest\"],\n  env: {\n    SYNAPSE_MIND_KEY: process.env.SYNAPSE_MIND_KEY!,\n    SYNAPSE_URL: \"https://synapse.schaefer.zone\",\n  },\n});\n\nconst client = new Client(\n  { name: \"my-app\", version: \"1.0.0\" },\n  { capabilities: {} }\n);\n\nawait client.connect(transport);\n\n// List all available tools\nconst { tools } = await client.listTools();\nconsole.log(`Available tools: ${tools.length}`);\nfor (const tool of tools) {\n  console.log(`- ${tool.name}: ${tool.description}`);\n}\n\n// Call a tool\nconst result = await client.callTool({\n  name: \"memory_recall\",\n  arguments: {},\n});\nconsole.log(result.content);\n\n// Store a memory\nawait client.callTool({\n  name: \"memory_store\",\n  arguments: {\n    category: \"fact\",\n    key: \"custom_client_test\",\n    content: \"Built a custom MCP client\",\n    tags: [\"test\", \"mcp\"],\n    priority: \"normal\",\n  },\n});\n\nawait client.close();\n```\n\n### HTTP/SSE で接続（リモート）\n\n```typescript\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\n\nconst transport = new SSEClientTransport(\n  new URL(\"https://synapse-mcp.schaefer.zone/sse\"),\n  {\n    requestInit: {\n      headers: {\n        Authorization: `Bearer ${process.env.SYNAPSE_MIND_KEY}`,\n      },\n    },\n  }\n);\n\nconst client = new Client(\n  { name: \"my-app\", version: \"1.0.0\" },\n  { capabilities: {} }\n);\n\nawait client.connect(transport);\n// ... use as above\n```\n\n## Python の例\n\n### インストール\n\n```bash\npip install mcp\n```\n\n### stdio で接続\n\n```python\nfrom mcp import ClientSession, StdioServerParameters\nfrom mcp.client.stdio import stdio_client\n\nserver_params = StdioServerParameters(\n    command=\"npx\",\n    args=[\"-y\", \"synapse-mcp-api@latest\"],\n    env={\n        \"SYNAPSE_MIND_KEY\": \"mk_YOUR_KEY\",\n        \"SYNAPSE_URL\": \"https://synapse.schaefer.zone\",\n    },\n)\n\nasync with stdio_client(server_params) as (read, write):\n    async with ClientSession(read, write) as session:\n        await session.initialize()\n\n        # List tools\n        tools = await session.list_tools()\n        print(f\"Available tools: {len(tools.tools)}\")\n\n        # Call a tool\n        result = await session.call_tool(\"memory_recall\", {})\n        print(result.content)\n\n        # Store a memory\n        await session.call_tool(\"memory_store\", {\n            \"category\": \"fact\",\n            \"key\": \"python_client_test\",\n            \"content\": \"Built a Python MCP client\",\n            \"tags\": [\"test\", \"mcp\", \"python\"],\n            \"priority\": \"normal\",\n        })\n```\n\n## ツールプロファイル\n\n接続時に、`Mcp-Tool-Profile` ヘッダー（HTTP/SSE）または `MCP_PROFILE` 環境変数（stdio）で特定のツールプロファイルを要求できます：\n\n```typescript\n// stdio: set env var\nenv: {\n  SYNAPSE_MIND_KEY: \"mk_...\",\n  MCP_PROFILE: \"minimal\",  // 8 tools instead of 119\n}\n\n// HTTP/SSE: set header\nrequestInit: {\n  headers: {\n    Authorization: \"Bearer mk_...\",\n    \"Mcp-Tool-Profile\": \"minimal\",\n  },\n}\n```\n\n## エラー処理\n\n```typescript\ntry {\n  const result = await client.callTool({ name: \"memory_recall\", arguments: {} });\n  if (result.isError) {\n    console.error(\"Tool error:\", result.content);\n  } else {\n    console.log(\"Success:\", result.content);\n  }\n} catch (err) {\n  console.error(\"MCP error:\", err);\n}\n```\n\n## ユースケース\n\n- **カスタム AI アシスタント** — 永続的メモリを持つ独自エージェントを構築\n- **ワークフロー自動化** — カスタムワークフローで Synapse ツールをチェーン\n- **データパイプライン** — メモリを抽出、変換、他の場所にロード\n- **監視ダッシュボード** — メモリ統計、チャット履歴、タスクを表示\n\n## 次のステップ\n\n- [MCP Specification](https://spec.modelcontextprotocol.io)\n- [Synapse MCP Repo](https://gitlab.com/schaefer-services/synapse-mcp)\n- [API Overview](/docs/api/overview)\n","content_html":"<h1>カスタム MCP クライアントを構築</h1>\n<p>独自の LLM アプリケーションを構築している場合、公式 MCP SDK を使用して Synapse MCP サーバーに直接接続できます。これにより、アプリは 79 個すべての Synapse ツールにアクセスできます。</p>\n<h2>SDK</h2>\n<table>\n<thead>\n<tr>\n<th>言語</th>\n<th>パッケージ</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>TypeScript/JavaScript</td>\n<td><code>@modelcontextprotocol/sdk</code></td>\n</tr>\n<tr>\n<td>Python</td>\n<td><code>mcp</code></td>\n</tr>\n</tbody></table>\n<h2>TypeScript の例</h2>\n<h3>インストール</h3>\n<pre><code class=\"hljs language-bash\">npm install @modelcontextprotocol/sdk</code></pre><h3>stdio で接続</h3>\n<pre><code class=\"hljs language-typescript\"><span class=\"hljs-keyword\">import</span> { <span class=\"hljs-title class_\">Client</span> } <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">&quot;@modelcontextprotocol/sdk/client/index.js&quot;</span>;\n<span class=\"hljs-keyword\">import</span> { <span class=\"hljs-title class_\">StdioClientTransport</span> } <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">&quot;@modelcontextprotocol/sdk/client/stdio.js&quot;</span>;\n\n<span class=\"hljs-keyword\">const</span> transport = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-title class_\">StdioClientTransport</span>({\n  <span class=\"hljs-attr\">command</span>: <span class=\"hljs-string\">&quot;npx&quot;</span>,\n  <span class=\"hljs-attr\">args</span>: [<span class=\"hljs-string\">&quot;-y&quot;</span>, <span class=\"hljs-string\">&quot;synapse-mcp-api@latest&quot;</span>],\n  <span class=\"hljs-attr\">env</span>: {\n    <span class=\"hljs-attr\">SYNAPSE_MIND_KEY</span>: process.<span class=\"hljs-property\">env</span>.<span class=\"hljs-property\">SYNAPSE_MIND_KEY</span>!,\n    <span class=\"hljs-attr\">SYNAPSE_URL</span>: <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone&quot;</span>,\n  },\n});\n\n<span class=\"hljs-keyword\">const</span> client = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-title class_\">Client</span>(\n  { <span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&quot;my-app&quot;</span>, <span class=\"hljs-attr\">version</span>: <span class=\"hljs-string\">&quot;1.0.0&quot;</span> },\n  { <span class=\"hljs-attr\">capabilities</span>: {} }\n);\n\n<span class=\"hljs-keyword\">await</span> client.<span class=\"hljs-title function_\">connect</span>(transport);\n\n<span class=\"hljs-comment\">// List all available tools</span>\n<span class=\"hljs-keyword\">const</span> { tools } = <span class=\"hljs-keyword\">await</span> client.<span class=\"hljs-title function_\">listTools</span>();\n<span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(<span class=\"hljs-string\">`Available tools: <span class=\"hljs-subst\">${tools.length}</span>`</span>);\n<span class=\"hljs-keyword\">for</span> (<span class=\"hljs-keyword\">const</span> tool <span class=\"hljs-keyword\">of</span> tools) {\n  <span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(<span class=\"hljs-string\">`- <span class=\"hljs-subst\">${tool.name}</span>: <span class=\"hljs-subst\">${tool.description}</span>`</span>);\n}\n\n<span class=\"hljs-comment\">// Call a tool</span>\n<span class=\"hljs-keyword\">const</span> result = <span class=\"hljs-keyword\">await</span> client.<span class=\"hljs-title function_\">callTool</span>({\n  <span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&quot;memory_recall&quot;</span>,\n  <span class=\"hljs-attr\">arguments</span>: {},\n});\n<span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(result.<span class=\"hljs-property\">content</span>);\n\n<span class=\"hljs-comment\">// Store a memory</span>\n<span class=\"hljs-keyword\">await</span> client.<span class=\"hljs-title function_\">callTool</span>({\n  <span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&quot;memory_store&quot;</span>,\n  <span class=\"hljs-attr\">arguments</span>: {\n    <span class=\"hljs-attr\">category</span>: <span class=\"hljs-string\">&quot;fact&quot;</span>,\n    <span class=\"hljs-attr\">key</span>: <span class=\"hljs-string\">&quot;custom_client_test&quot;</span>,\n    <span class=\"hljs-attr\">content</span>: <span class=\"hljs-string\">&quot;Built a custom MCP client&quot;</span>,\n    <span class=\"hljs-attr\">tags</span>: [<span class=\"hljs-string\">&quot;test&quot;</span>, <span class=\"hljs-string\">&quot;mcp&quot;</span>],\n    <span class=\"hljs-attr\">priority</span>: <span class=\"hljs-string\">&quot;normal&quot;</span>,\n  },\n});\n\n<span class=\"hljs-keyword\">await</span> client.<span class=\"hljs-title function_\">close</span>();</code></pre><h3>HTTP/SSE で接続（リモート）</h3>\n<pre><code class=\"hljs language-typescript\"><span class=\"hljs-keyword\">import</span> { <span class=\"hljs-title class_\">Client</span> } <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">&quot;@modelcontextprotocol/sdk/client/index.js&quot;</span>;\n<span class=\"hljs-keyword\">import</span> { <span class=\"hljs-title class_\">SSEClientTransport</span> } <span class=\"hljs-keyword\">from</span> <span class=\"hljs-string\">&quot;@modelcontextprotocol/sdk/client/sse.js&quot;</span>;\n\n<span class=\"hljs-keyword\">const</span> transport = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-title class_\">SSEClientTransport</span>(\n  <span class=\"hljs-keyword\">new</span> <span class=\"hljs-title function_\">URL</span>(<span class=\"hljs-string\">&quot;https://synapse-mcp.schaefer.zone/sse&quot;</span>),\n  {\n    <span class=\"hljs-attr\">requestInit</span>: {\n      <span class=\"hljs-attr\">headers</span>: {\n        <span class=\"hljs-title class_\">Authorization</span>: <span class=\"hljs-string\">`Bearer <span class=\"hljs-subst\">${process.env.SYNAPSE_MIND_KEY}</span>`</span>,\n      },\n    },\n  }\n);\n\n<span class=\"hljs-keyword\">const</span> client = <span class=\"hljs-keyword\">new</span> <span class=\"hljs-title class_\">Client</span>(\n  { <span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&quot;my-app&quot;</span>, <span class=\"hljs-attr\">version</span>: <span class=\"hljs-string\">&quot;1.0.0&quot;</span> },\n  { <span class=\"hljs-attr\">capabilities</span>: {} }\n);\n\n<span class=\"hljs-keyword\">await</span> client.<span class=\"hljs-title function_\">connect</span>(transport);\n<span class=\"hljs-comment\">// ... use as above</span></code></pre><h2>Python の例</h2>\n<h3>インストール</h3>\n<pre><code class=\"hljs language-bash\">pip install mcp</code></pre><h3>stdio で接続</h3>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">from</span> mcp <span class=\"hljs-keyword\">import</span> ClientSession, StdioServerParameters\n<span class=\"hljs-keyword\">from</span> mcp.client.stdio <span class=\"hljs-keyword\">import</span> stdio_client\n\nserver_params = StdioServerParameters(\n    command=<span class=\"hljs-string\">&quot;npx&quot;</span>,\n    args=[<span class=\"hljs-string\">&quot;-y&quot;</span>, <span class=\"hljs-string\">&quot;synapse-mcp-api@latest&quot;</span>],\n    env={\n        <span class=\"hljs-string\">&quot;SYNAPSE_MIND_KEY&quot;</span>: <span class=\"hljs-string\">&quot;mk_YOUR_KEY&quot;</span>,\n        <span class=\"hljs-string\">&quot;SYNAPSE_URL&quot;</span>: <span class=\"hljs-string\">&quot;https://synapse.schaefer.zone&quot;</span>,\n    },\n)\n\n<span class=\"hljs-keyword\">async</span> <span class=\"hljs-keyword\">with</span> stdio_client(server_params) <span class=\"hljs-keyword\">as</span> (read, write):\n    <span class=\"hljs-keyword\">async</span> <span class=\"hljs-keyword\">with</span> ClientSession(read, write) <span class=\"hljs-keyword\">as</span> session:\n        <span class=\"hljs-keyword\">await</span> session.initialize()\n\n        <span class=\"hljs-comment\"># List tools</span>\n        tools = <span class=\"hljs-keyword\">await</span> session.list_tools()\n        <span class=\"hljs-built_in\">print</span>(<span class=\"hljs-string\">f&quot;Available tools: <span class=\"hljs-subst\">{<span class=\"hljs-built_in\">len</span>(tools.tools)}</span>&quot;</span>)\n\n        <span class=\"hljs-comment\"># Call a tool</span>\n        result = <span class=\"hljs-keyword\">await</span> session.call_tool(<span class=\"hljs-string\">&quot;memory_recall&quot;</span>, {})\n        <span class=\"hljs-built_in\">print</span>(result.content)\n\n        <span class=\"hljs-comment\"># Store a memory</span>\n        <span class=\"hljs-keyword\">await</span> session.call_tool(<span class=\"hljs-string\">&quot;memory_store&quot;</span>, {\n            <span class=\"hljs-string\">&quot;category&quot;</span>: <span class=\"hljs-string\">&quot;fact&quot;</span>,\n            <span class=\"hljs-string\">&quot;key&quot;</span>: <span class=\"hljs-string\">&quot;python_client_test&quot;</span>,\n            <span class=\"hljs-string\">&quot;content&quot;</span>: <span class=\"hljs-string\">&quot;Built a Python MCP client&quot;</span>,\n            <span class=\"hljs-string\">&quot;tags&quot;</span>: [<span class=\"hljs-string\">&quot;test&quot;</span>, <span class=\"hljs-string\">&quot;mcp&quot;</span>, <span class=\"hljs-string\">&quot;python&quot;</span>],\n            <span class=\"hljs-string\">&quot;priority&quot;</span>: <span class=\"hljs-string\">&quot;normal&quot;</span>,\n        })</code></pre><h2>ツールプロファイル</h2>\n<p>接続時に、<code>Mcp-Tool-Profile</code> ヘッダー（HTTP/SSE）または <code>MCP_PROFILE</code> 環境変数（stdio）で特定のツールプロファイルを要求できます：</p>\n<pre><code class=\"hljs language-typescript\"><span class=\"hljs-comment\">// stdio: set env var</span>\n<span class=\"hljs-attr\">env</span>: {\n  <span class=\"hljs-attr\">SYNAPSE_MIND_KEY</span>: <span class=\"hljs-string\">&quot;mk_...&quot;</span>,\n  <span class=\"hljs-attr\">MCP_PROFILE</span>: <span class=\"hljs-string\">&quot;minimal&quot;</span>,  <span class=\"hljs-comment\">// 8 tools instead of 119</span>\n}\n\n<span class=\"hljs-comment\">// HTTP/SSE: set header</span>\n<span class=\"hljs-attr\">requestInit</span>: {\n  <span class=\"hljs-attr\">headers</span>: {\n    <span class=\"hljs-title class_\">Authorization</span>: <span class=\"hljs-string\">&quot;Bearer mk_...&quot;</span>,\n    <span class=\"hljs-string\">&quot;Mcp-Tool-Profile&quot;</span>: <span class=\"hljs-string\">&quot;minimal&quot;</span>,\n  },\n}</code></pre><h2>エラー処理</h2>\n<pre><code class=\"hljs language-typescript\"><span class=\"hljs-keyword\">try</span> {\n  <span class=\"hljs-keyword\">const</span> result = <span class=\"hljs-keyword\">await</span> client.<span class=\"hljs-title function_\">callTool</span>({ <span class=\"hljs-attr\">name</span>: <span class=\"hljs-string\">&quot;memory_recall&quot;</span>, <span class=\"hljs-attr\">arguments</span>: {} });\n  <span class=\"hljs-keyword\">if</span> (result.<span class=\"hljs-property\">isError</span>) {\n    <span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">error</span>(<span class=\"hljs-string\">&quot;Tool error:&quot;</span>, result.<span class=\"hljs-property\">content</span>);\n  } <span class=\"hljs-keyword\">else</span> {\n    <span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">log</span>(<span class=\"hljs-string\">&quot;Success:&quot;</span>, result.<span class=\"hljs-property\">content</span>);\n  }\n} <span class=\"hljs-keyword\">catch</span> (err) {\n  <span class=\"hljs-variable language_\">console</span>.<span class=\"hljs-title function_\">error</span>(<span class=\"hljs-string\">&quot;MCP error:&quot;</span>, err);\n}</code></pre><h2>ユースケース</h2>\n<ul>\n<li><strong>カスタム AI アシスタント</strong> — 永続的メモリを持つ独自エージェントを構築</li>\n<li><strong>ワークフロー自動化</strong> — カスタムワークフローで Synapse ツールをチェーン</li>\n<li><strong>データパイプライン</strong> — メモリを抽出、変換、他の場所にロード</li>\n<li><strong>監視ダッシュボード</strong> — メモリ統計、チャット履歴、タスクを表示</li>\n</ul>\n<h2>次のステップ</h2>\n<ul>\n<li><a href=\"https://spec.modelcontextprotocol.io\">MCP Specification</a></li>\n<li><a href=\"https://gitlab.com/schaefer-services/synapse-mcp\">Synapse MCP Repo</a></li>\n<li><a href=\"/docs/api/overview\">API Overview</a></li>\n</ul>\n","urls":{"html":"/docs/mcp/custom-client","text":"/docs/mcp/custom-client?format=text","json":"/docs/mcp/custom-client?format=json","llm":"/docs/mcp/custom-client?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}