{"id":204,"date":"2026-11-08T07:22:36","date_gmt":"2026-11-08T03:22:36","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/2026\/11\/08\/opencode-mcp-deepseek\/"},"modified":"2026-11-08T07:22:36","modified_gmt":"2026-11-08T03:22:36","slug":"opencode-mcp-deepseek","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/pt\/2026\/11\/08\/opencode-mcp-deepseek\/","title":{"rendered":"MCP em OpenCode no DeepSeek: como conectar ferramentas externas"},"content":{"rendered":"<p>MCP (Model Context Protocol) \u00e9 um protocolo aberto que descreve como conectar ferramentas externas e fontes de dados ao modelo de linguagem: um sistema de arquivos, documenta\u00e7\u00e3o, rastreador de tarefas, rastreador de bugs ou seu pr\u00f3prio servi\u00e7o. Em vez de incorporar cada ferramenta ao agente, voc\u00ea configura um servidor MCP separado e o agente se comunica com ele de acordo com o esquema padr\u00e3o.<\/p>\n<p>OpenCode oferece suporte a MCP pronto para uso: tanto servidores locais, que s\u00e3o iniciados por um processo filho, quanto servidores remotos, acess\u00edveis via HTTP. Um ponto importante \u00e9 que toda a camada MCP \u00e9 implementada do lado do pr\u00f3prio OpenCode, e n\u00e3o do lado do provedor do modelo. Portanto, o DeepSeek recebe ferramentas MCP como fun\u00e7\u00f5es normais na solicita\u00e7\u00e3o, e n\u00e3o precisa saber nada sobre o protocolo em si.<\/p>\n<p>Neste post, veremos como adicionar um servidor local e remoto, como obter autoriza\u00e7\u00e3o, como n\u00e3o se afogar em tokens e o que considerar ao trabalhar com modelos DeepSeek.<\/p>\n<h2>O que voc\u00ea precisa<\/h2>\n<p>Para funcionar voc\u00ea precisa de tr\u00eas coisas:<\/p>\n<ul>\n<li><b>OpenCode instalado.<\/b> Se o agente ainda n\u00e3o estiver configurado, discuti o procedimento para instalar e conectar o DeepSeek em uma nota separada.<\/li>\n<li><b>Node.js e npx.<\/b> Necess\u00e1rio para servidores MCP locais, que s\u00e3o distribu\u00eddos como pacotes npm.<\/li>\n<li><b>Chaves de acesso.<\/b> Somente para servidores remotos que requerem autoriza\u00e7\u00e3o. Servidores p\u00fablicos como o Context7 funcionam sem chave, mas com limites mais baixos.<\/li>\n<\/ul>\n<h2>Como funciona<\/h2>\n<p>Os servidores s\u00e3o descritos na configura\u00e7\u00e3o do OpenCode no bloco <b>mcp<\/b>. Cada servidor possui um nome exclusivo pelo qual pode ser mencionado em uma solicita\u00e7\u00e3o. As ferramentas do servidor s\u00e3o registradas com esse prefixo de nome, portanto, n\u00e3o h\u00e1 conflitos entre servidores diferentes.<\/p>\n<p>Ap\u00f3s a conex\u00e3o, as ferramentas MCP ficam dispon\u00edveis para os modelos junto com as integradas: leitura de arquivos, edi\u00e7\u00e3o de c\u00f3digo e execu\u00e7\u00e3o de comandos. Do ponto de vista do DeepSeek, essas s\u00e3o fun\u00e7\u00f5es comuns que um agente pode chamar \u2013 e \u00e9 por isso que o pacote funciona sem qualquer suporte MCP no lado da API do modelo.<\/p>\n<h2>Servidor local<\/h2>\n<p>A maneira mais f\u00e1cil de se familiarizar com o mecanismo \u00e9 o servidor de teste <b>@modelcontextprotocol\/server-everything<\/b>. Vamos adicion\u00e1-lo ao arquivo <b>opencode.json<\/b> na raiz do projeto:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"mcp_everything\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"@modelcontextprotocol\/server-everything\"]\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>O campo <b>comando<\/b> \u00e9 o comando de inicializa\u00e7\u00e3o do servidor e seus argumentos na forma de um array. Ap\u00f3s reiniciar o OpenCode, as ferramentas aparecer\u00e3o na sess\u00e3o e poder\u00e3o ser solicitadas explicitamente:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 mcp_everything, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u043e\u0436\u0438\u0442\u044c 3 \u0438 4\n<\/code><\/pre>\n<\/div>\n<p>O servidor local possui v\u00e1rios campos mais \u00fateis. <b>environment<\/b> define as vari\u00e1veis \u200b\u200bde ambiente do processo, <b>cwd<\/b> &#8211; o diret\u00f3rio de trabalho, <b>timeout<\/b> &#8211; tempo limite da solicita\u00e7\u00e3o em milissegundos e <b>enabled<\/b> permite desabilitar temporariamente o servidor sem remov\u00ea-lo da configura\u00e7\u00e3o.<\/p>\n<h2>Servidor remoto<\/h2>\n<p>Servidores remotos s\u00e3o mais convenientes: voc\u00ea n\u00e3o precisa executar nada localmente e podem ser acessados \u200b\u200bvia URL. Um bom exemplo \u00e9 o Context7, que procura documenta\u00e7\u00e3o de biblioteca atualizada. Ele se conecta sem chave:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"context7\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.context7.com\/mcp\"\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Se voc\u00ea possui uma conta Context7 gratuita, o segredo \u00e9 aumentar os limites. Os cabe\u00e7alhos s\u00e3o transmitidos atrav\u00e9s do bloco <b>headers<\/b> e \u00e9 conveniente manter a pr\u00f3pria chave em uma vari\u00e1vel de ambiente:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"context7\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.context7.com\/mcp\",\n      \"headers\": {\n        \"CONTEXT7_API_KEY\": \"{env:CONTEXT7_API_KEY}\"\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>A constru\u00e7\u00e3o <b>{env:NAME}<\/b> substitui o valor da vari\u00e1vel de ambiente ao carregar a configura\u00e7\u00e3o, para que a chave n\u00e3o acabe no reposit\u00f3rio. Antes de iniciar o agente, a vari\u00e1vel deve ser exportada no terminal.<\/p>\n<p>Outro servidor p\u00fablico \u00fatil \u00e9 o Grep da Vercel, procure exemplos de c\u00f3digo no GitHub:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"gh_grep\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.grep.app\"\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<h2>Autoriza\u00e7\u00e3o via OAuth<\/h2>\n<p>Alguns servidores remotos requerem OAuth. O OpenCode pode passar por esse cen\u00e1rio sozinho: ele percebe a resposta 401, aciona a autoriza\u00e7\u00e3o e salva os tokens. Para Sentry, basta especificar o servidor:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"sentry\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.sentry.dev\/mcp\",\n      \"oauth\": {}\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>Depois disso, a autoriza\u00e7\u00e3o pode ser iniciada manualmente &#8211; o navegador ser\u00e1 aberto:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>opencode mcp auth sentry\n<\/code><\/pre>\n<\/div>\n<p>Os comandos de servi\u00e7o tamb\u00e9m s\u00e3o \u00fateis no trabalho di\u00e1rio. <b>opencode mcp list<\/b> mostra servidores e status de autoriza\u00e7\u00e3o, <b>opencode mcp logout<\/b> exclui tokens armazenados e <b>opencode mcp debug<\/b> verifica a conectividade de rede e a descoberta OAuth para um servidor espec\u00edfico. Os tokens s\u00e3o armazenados localmente no arquivo <b>~\/.local\/share\/opencode\/mcp-auth.json<\/b>.<\/p>\n<p>Se o servidor n\u00e3o usar OAuth, mas uma chave de API normal, a autoriza\u00e7\u00e3o autom\u00e1tica dever\u00e1 ser desabilitada, caso contr\u00e1rio, o OpenCode tentar\u00e1 passar o OAuth onde n\u00e3o for necess\u00e1rio:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"my-api-key-server\": {\n      \"type\": \"remote\",\n      \"url\": \"https:\/\/mcp.example.com\/mcp\",\n      \"oauth\": false,\n      \"headers\": {\n        \"Authorization\": \"Bearer {env:MY_API_KEY}\"\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<h2>Gerenciamento de ferramentas<\/h2>\n<p>As ferramentas MCP consomem contexto: cada servidor adiciona descri\u00e7\u00f5es de suas fun\u00e7\u00f5es \u00e0 solicita\u00e7\u00e3o. Portanto, \u00e9 melhor manter desligados os servidores que raramente s\u00e3o necess\u00e1rios. Isso pode ser feito globalmente atrav\u00e9s do bloco <b>tools<\/b>:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"my-mcp-foo\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"my-mcp-command-foo\"]\n    },\n    \"my-mcp-bar\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"my-mcp-command-bar\"]\n    }\n  },\n  \"tools\": {\n    \"my-mcp*\": false\n  }\n}\n<\/code><\/pre>\n<\/div>\n<p>O modelo <b>my-mcp*<\/b> desativa todas as ferramentas cujo nome come\u00e7a com este prefixo. Se houver muitos servidores, faz mais sentido desativ\u00e1-los globalmente e ativ\u00e1-los localmente para um agente espec\u00edfico:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>{\n  \"$schema\": \"https:\/\/opencode.ai\/config.json\",\n  \"mcp\": {\n    \"my-mcp\": {\n      \"type\": \"local\",\n      \"command\": [\"npx\", \"-y\", \"my-mcp-command\"],\n      \"enabled\": true\n    }\n  },\n  \"tools\": {\n    \"my-mcp*\": false\n  },\n  \"agent\": {\n    \"my-agent\": {\n      \"tools\": {\n        \"my-mcp*\": true\n      }\n    }\n  }\n}\n<\/code><\/pre>\n<\/div>\n<h2>Recursos do DeepSeek<\/h2>\n<p>A conex\u00e3o com o DeepSeek funciona porque os modelos suportam fun\u00e7\u00f5es de chamada e as ferramentas MCP para eles parecem fun\u00e7\u00f5es comuns. O pr\u00f3prio DeepSeek n\u00e3o conecta servidores MCP e n\u00e3o deveria: a conex\u00e3o \u00e9 controlada pelo OpenCode.<\/p>\n<p>O que voc\u00ea deve prestar aten\u00e7\u00e3o:<\/p>\n<ul>\n<li><b>Selecionando um modelo.<\/b> Para edi\u00e7\u00f5es rotineiras e pequenas, <b>deepseek-flash<\/b> \u00e9 suficiente. Para tarefas em que voc\u00ea precisa manter muito contexto em mente e selecionar cuidadosamente uma ferramenta, \u00e9 melhor fornecer <b>deepseek-v4-pro<\/b>.<\/li>\n<li><b>Tamanho do contexto.<\/b> Servidores pesados \u200b\u200bcomo o GitHub MCP adicionam muitos tokens e, junto com um projeto grande, atingem facilmente o limite. Ative-os apenas durante uma tarefa espec\u00edfica.<\/li>\n<li><b>Custo<\/b> Os esquemas de ferramentas s\u00e3o enviados com cada solicita\u00e7\u00e3o, portanto, quanto mais servidores inclu\u00eddos, mais cara ser\u00e1 cada itera\u00e7\u00e3o. Voc\u00ea paga diretamente ao provedor, ent\u00e3o os servidores extras ficam vis\u00edveis na sua conta.<\/li>\n<li><b>Dicas para o agente.<\/b> \u00c9 mais seguro n\u00e3o confiar na engenhosidade do modelo, mas nomear diretamente o servidor na solicita\u00e7\u00e3o ou escrever uma regra em <b>AGENTS.md<\/b>.<\/li>\n<\/ul>\n<p>Um exemplo de regra para <b>AGENTS.md<\/b>, para que o pr\u00f3prio agente acesse a fonte necess\u00e1ria:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism undefined-numbers lang-unknown\" data-lang=\"unknown\"><code>\u041a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b context7.\n<\/code><\/pre>\n<\/div>\n<h2>Receita pr\u00e1tica<\/h2>\n<p>Para o trabalho di\u00e1rio, dois servidores geralmente s\u00e3o suficientes: Context7 para documenta\u00e7\u00e3o e um servidor restrito para uma tarefa espec\u00edfica &#8211; por exemplo, Sentry para analisar erros ou Grep para procurar exemplos de c\u00f3digo. \u00c9 melhor manter o resto desligado e lig\u00e1-lo conforme necess\u00e1rio.<\/p>\n<p>Meu procedimento \u00e9 o seguinte: adiciono o servidor em <b>opencode.json<\/b>, reinicio o OpenCode, verifico a lista em <b>opencode mcp list<\/b> e fa\u00e7o uma pergunta de teste que menciona explicitamente o servidor. Se a ferramenta n\u00e3o for chamada, procuro <b>opencode mcp debug<\/b> e o tempo limite &#8211; um servidor lento pode n\u00e3o ter tempo para responder nos 30 segundos alocados.<\/p>\n<h2>No que prestar aten\u00e7\u00e3o<\/h2>\n<p>Alguns pontos pr\u00e1ticos. Os servidores MCP s\u00e3o c\u00f3digos confi\u00e1veis: o servidor local \u00e9 executado em sua m\u00e1quina com seus direitos e voc\u00ea envia dados de solicita\u00e7\u00e3o para o remoto. Portanto, a instala\u00e7\u00e3o de servidores aleat\u00f3rios da Internet deve ser feita com o mesmo cuidado que qualquer CLI de terceiros.<\/p>\n<p>Mantenha chaves e tokens em vari\u00e1veis \u200b\u200bde ambiente e n\u00e3o fa\u00e7a commit no reposit\u00f3rio. O OpenCode armazena tokens OAuth localmente, mas em uma m\u00e1quina compartilhada tamb\u00e9m vale a pena considerar isso: <b>opencode mcp logout<\/b> os exclui quando o acesso n\u00e3o \u00e9 mais necess\u00e1rio.<\/p>\n<p>E mais uma coisa: n\u00e3o ligue tudo de uma vez. O MCP acrescenta ferramentas ao contexto, e contexto \u00e9 dinheiro e qualidade de resposta. Dois ou tr\u00eas servidores realmente necess\u00e1rios funcionam muito melhor do que dez conectados, apenas para garantir.<\/p>\n<h2>Links<\/h2>\n<p><a href=\"https:\/\/opencode.ai\/docs\/mcp-servers\/\" rel=\"noopener\" target=\"_blank\">https:\/\/opencode.ai\/docs\/mcp-servers\/<\/a><br \/>\n<a href=\"https:\/\/opencode.ai\/docs\/config\/\" rel=\"noopener\" target=\"_blank\">https:\/\/opencode.ai\/docs\/config\/<\/a><br \/>\n<a href=\"https:\/\/modelcontextprotocol.io\/\" rel=\"noopener\" target=\"_blank\">https:\/\/modelcontextprotocol.io\/<\/a><br \/>\n<a href=\"https:\/\/github.com\/upstash\/context7\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/upstash\/context7<\/a><br \/>\n<a href=\"https:\/\/mcp.sentry.dev\" rel=\"noopener\" target=\"_blank\">https:\/\/mcp.sentry.dev<\/a><br \/>\n<a href=\"https:\/\/mcp.grep.app\" rel=\"noopener\" target=\"_blank\">https:\/\/mcp.grep.app<\/a><br \/>\n<a href=\"https:\/\/github.com\/anomalyco\/opencode\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/anomalyco\/opencode<\/a><\/p>\n<h2>Fontes<\/h2>\n<p><a href=\"https:\/\/opencode.ai\/docs\/mcp-servers\/\" rel=\"noopener\" target=\"_blank\">https:\/\/opencode.ai\/docs\/mcp-servers\/<\/a><br \/>\n<a href=\"https:\/\/modelcontextprotocol.io\/\" rel=\"noopener\" target=\"_blank\">https:\/\/modelcontextprotocol.io\/<\/a><br \/>\n<a href=\"https:\/\/api-docs.deepseek.com\/\" rel=\"noopener\" target=\"_blank\">https:\/\/api-docs.deepseek.com\/<\/a><br \/>\n<a href=\"https:\/\/api-docs.deepseek.com\/quick_start\/agent_integrations\/opencode\" rel=\"noopener\" target=\"_blank\">https:\/\/api-docs.deepseek.com\/quick_start\/agent_integrations\/opencode<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>MCP (Model Context Protocol) \u00e9 um protocolo aberto que descreve como conectar ferramentas externas e fontes de dados ao modelo de linguagem: um sistema de arquivos, documenta\u00e7\u00e3o, rastreador de tarefas, rastreador de bugs ou seu pr\u00f3prio servi\u00e7o. Em vez de incorporar cada ferramenta ao agente, voc\u00ea configura um servidor MCP separado e o agente se [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-204","post","type-post","status-publish","format-standard","hentry","category-notes"],"translation":{"provider":"WPGlobus","version":"3.0.6","language":"pt","enabled_languages":["en","ru","zh","de","ja","fr","es","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"es":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":true,"content":true,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/204","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=204"}],"version-history":[{"count":0,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/204\/revisions"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}