{"title":"Construa um cliente MCP customizado","slug":"custom-client","category":"mcp","summary":"Conecte-se ao servidor MCP do Synapse a partir do seu próprio aplicativo usando o SDK MCP.","audience":["human","llm"],"tags":["mcp","custom","sdk","development"],"difficulty":"advanced","updated":"2026-06-27","word_count":177,"read_minutes":1,"lang":"pt","translated":true,"requested_lang":"pt","content_markdown":"\n# Construa um cliente MCP customizado\n\nSe você está construindo seu próprio aplicativo LLM, pode se conectar ao\nservidor MCP do Synapse diretamente usando o SDK oficial do MCP. Isso dá ao\nseu app acesso a todas as 79 ferramentas do Synapse.\n\n## SDKs\n\n| Linguagem | Pacote |\n|-----------|--------|\n| TypeScript/JavaScript | `@modelcontextprotocol/sdk` |\n| Python | `mcp` |\n\n## Exemplo em TypeScript\n\n### Instalação\n\n```bash\nnpm install @modelcontextprotocol/sdk\n```\n\n### Conexão 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### Conexão via HTTP/SSE (remoto)\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## Exemplo em Python\n\n### Instalação\n\n```bash\npip install mcp\n```\n\n### Conexão 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\nAo conectar, você pode solicitar um tool profile específico via cabeçalho\n`Mcp-Tool-Profile` (HTTP/SSE) ou 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## Tratamento de erros\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## Casos de uso\n\n- **Assistentes de IA customizados** — construa seu próprio agente com memória persistente\n- **Automação de workflows** — encadeie ferramentas do Synapse em workflows customizados\n- **Pipelines de dados** — extraia memórias, transforme, carregue em outro lugar\n- **Dashboards de monitoramento** — exiba estatísticas de memória, histórico de chat, tarefas\n\n## Próximos passos\n\n- [Especificação MCP](https://spec.modelcontextprotocol.io)\n- [Repo do Synapse MCP](https://gitlab.com/schaefer-services/synapse-mcp)\n- [Visão geral da API](/docs/api/overview)\n","content_html":"<h1>Construa um cliente MCP customizado</h1>\n<p>Se você está construindo seu próprio aplicativo LLM, pode se conectar ao\nservidor MCP do Synapse diretamente usando o SDK oficial do MCP. Isso dá ao\nseu app acesso a todas as 79 ferramentas do Synapse.</p>\n<h2>SDKs</h2>\n<table>\n<thead>\n<tr>\n<th>Linguagem</th>\n<th>Pacote</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>Exemplo em TypeScript</h2>\n<h3>Instalação</h3>\n<pre><code class=\"hljs language-bash\">npm install @modelcontextprotocol/sdk</code></pre><h3>Conexão 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>Conexão via HTTP/SSE (remoto)</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>Exemplo em Python</h2>\n<h3>Instalação</h3>\n<pre><code class=\"hljs language-bash\">pip install mcp</code></pre><h3>Conexão 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>Ao conectar, você pode solicitar um tool profile específico via cabeçalho\n<code>Mcp-Tool-Profile</code> (HTTP/SSE) ou 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>Tratamento de erros</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>Casos de uso</h2>\n<ul>\n<li><strong>Assistentes de IA customizados</strong> — construa seu próprio agente com memória persistente</li>\n<li><strong>Automação de workflows</strong> — encadeie ferramentas do Synapse em workflows customizados</li>\n<li><strong>Pipelines de dados</strong> — extraia memórias, transforme, carregue em outro lugar</li>\n<li><strong>Dashboards de monitoramento</strong> — exiba estatísticas de memória, histórico de chat, tarefas</li>\n</ul>\n<h2>Próximos passos</h2>\n<ul>\n<li><a href=\"https://spec.modelcontextprotocol.io\">Especificação MCP</a></li>\n<li><a href=\"https://gitlab.com/schaefer-services/synapse-mcp\">Repo do Synapse MCP</a></li>\n<li><a href=\"/docs/api/overview\">Visão geral da 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"]}