{"title":"Membangun Klien MCP Khusus","slug":"custom-client","category":"mcp","summary":"Hubungkan ke Synapse MCP server dari aplikasi Anda sendiri menggunakan MCP SDK.","audience":["human","llm"],"tags":["mcp","custom","sdk","development"],"difficulty":"advanced","updated":"2026-06-27","word_count":156,"read_minutes":1,"lang":"id","translated":true,"requested_lang":"id","content_markdown":"\n# Membangun Klien MCP Khusus\n\nJika Anda membangun aplikasi LLM Anda sendiri, Anda dapat terhubung ke Synapse\nMCP server langsung menggunakan SDK MCP resmi. Ini memberikan aplikasi Anda\nakses ke semua 79 alat Synapse.\n\n## SDK\n\n| Bahasa | Paket |\n|----------|---------|\n| TypeScript/JavaScript | `@modelcontextprotocol/sdk` |\n| Python | `mcp` |\n\n## Contoh TypeScript\n\n### Pasang\n\n```bash\nnpm install @modelcontextprotocol/sdk\n```\n\n### Hubungkan via 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### Hubungkan via HTTP/SSE (remote)\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## Contoh Python\n\n### Pasang\n\n```bash\npip install mcp\n```\n\n### Hubungkan via 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## Tool Profiles\n\nSaat menghubungkan, Anda dapat meminta tool profile spesifik melalui header\n`Mcp-Tool-Profile` (HTTP/SSE) atau env var `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## Penanganan Error\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## Kasus Penggunaan\n\n- **Asisten AI khusus** — bangun agen Anda sendiri dengan memori persisten\n- **Otomasi alur kerja** — rangkai alat Synapse dalam alur kerja khusus\n- **Pipeline data** — ekstrak memori, transformasi, muat di tempat lain\n- **Dashboard pemantauan** — tampilkan statistik memori, riwayat chat, tugas\n\n## Langkah Berikutnya\n\n- [Spesifikasi MCP](https://spec.modelcontextprotocol.io)\n- [Repo Synapse MCP](https://gitlab.com/schaefer-services/synapse-mcp)\n- [Ikhtisar API](/docs/api/overview)\n","content_html":"<h1>Membangun Klien MCP Khusus</h1>\n<p>Jika Anda membangun aplikasi LLM Anda sendiri, Anda dapat terhubung ke Synapse\nMCP server langsung menggunakan SDK MCP resmi. Ini memberikan aplikasi Anda\nakses ke semua 79 alat Synapse.</p>\n<h2>SDK</h2>\n<table>\n<thead>\n<tr>\n<th>Bahasa</th>\n<th>Paket</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>Contoh TypeScript</h2>\n<h3>Pasang</h3>\n<pre><code class=\"hljs language-bash\">npm install @modelcontextprotocol/sdk</code></pre><h3>Hubungkan via 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>Hubungkan via HTTP/SSE (remote)</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>Contoh Python</h2>\n<h3>Pasang</h3>\n<pre><code class=\"hljs language-bash\">pip install mcp</code></pre><h3>Hubungkan via 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>Tool Profiles</h2>\n<p>Saat menghubungkan, Anda dapat meminta tool profile spesifik melalui header\n<code>Mcp-Tool-Profile</code> (HTTP/SSE) atau env var <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>Penanganan Error</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>Kasus Penggunaan</h2>\n<ul>\n<li><strong>Asisten AI khusus</strong> — bangun agen Anda sendiri dengan memori persisten</li>\n<li><strong>Otomasi alur kerja</strong> — rangkai alat Synapse dalam alur kerja khusus</li>\n<li><strong>Pipeline data</strong> — ekstrak memori, transformasi, muat di tempat lain</li>\n<li><strong>Dashboard pemantauan</strong> — tampilkan statistik memori, riwayat chat, tugas</li>\n</ul>\n<h2>Langkah Berikutnya</h2>\n<ul>\n<li><a href=\"https://spec.modelcontextprotocol.io\">Spesifikasi MCP</a></li>\n<li><a href=\"https://gitlab.com/schaefer-services/synapse-mcp\">Repo Synapse MCP</a></li>\n<li><a href=\"/docs/api/overview\">Ikhtisar API</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"]}